【问题标题】:Laravel 5: how to put admin controllers in a folder?Laravel 5:如何将管理控制器放在文件夹中?
【发布时间】:2015-05-22 23:24:28
【问题描述】:

我正在 Laravel 5 中创建我的第一个管理面板。我想组织我的控制器:

Http
    Controllers
        Admin
            DashboardController.php
        Controller.php
        WelcomeController.php

但是我在让它工作时遇到了一些麻烦。

DashboardController.php 是:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class DashboardController extends Controller {

    public function index()
    {
        return \View::make('admin/dashboard');
    }
}

?>

我的路线包含:

Route::group(array('namespace'=>'Admin'), function()
{
    Route::get('/dashboard', array('as' => 'dashboard', 'uses' => 'DashboardController@index'));
});

// Eventually I will check for authentication using:
// Route::group(array('before' => 'auth', 'namespace'=>'Admin'), function()...

当我导航到 /dashboard 时,我得到的错误是:

类 App\Http\Controllers\Admin\DashboardController 不存在

有什么建议吗?谢谢!

【问题讨论】:

    标签: routes namespaces laravel-5 controllers


    【解决方案1】:

    尝试在命名空间中使用文件夹名称的代码,您必须使用文件夹作为命名空间,即它遵循文件夹名称作为命名空间 App/Http/Controller/Admin

    namespace App\Http\Controllers\Admin;
    
    use App\Http\Controllers\Controller;
    
    class DashboardController extends Controller {
    
        public function index()
        {
            return \View::make('admin/dashboard');
        }
    }
    
    ?>
    

    路由保持原样

    Route::group(array('namespace'=>'Admin'), function()
    {
        Route::get('/dashboard', array('as' => 'dashboard', 'uses' => 'DashboardController@index'));
    });
    

    【讨论】:

      【解决方案2】:

      与以前的 Laravel 版本相比,Laravel 5 更严格地遵守命名空间标准。

      这意味着更改文件夹结构也会更改自动加载器查找类的命名空间。

      在本例中,您已将命名空间 Admin 添加到 DashboardController。

      您的声明 namespace App\Http\Controllers; 应更改为

      namespace App\Http\Controllers\Admin;
      

      同样,如果您对文件夹结构进行进一步更改,例如在 Admin 下为 SuperAdmin 添加一个新子文件夹,您需要将该命名空间添加到该文件夹​​中的类。这也适用于其他文件夹,例如您的 HandlersEvents 等。

      如果您开始更改文件夹结构,最好了解 PHP 的命名空间概念。这是一个快速学习的好教程:http://daylerees.com/php-namespaces-explained

      【讨论】:

      • @clone45 虽然,这是公认的答案,但内容是错误的。您不需要遵循任何类型的特殊文件夹结构。你可以把类放在你想要的任何文件夹中。但是您只需要确保您的命名空间由作曲家跟踪,并且在转储时,其对应条目进入autoload_classmap.php。只要作曲家可以找到它,它就会为您包含它无论它在什么文件夹中
      【解决方案3】:

      存在一种误解,即 Laravel 5 现在强制使用特殊的文件夹结构。

      但是不,它没有

      您的代码的问题是:

      Route::group(array('namespace'=>'Admin'), function()
      {
          Route::get('/dashboard', 
          array('as' => 'dashboard', 'uses' => 'DashboardController@index'));
      });
      

      您正在使用命名空间Admin,而在您的控制器中,没有这样的命名空间。因此,laravel 会抱怨。

      如果您删除此array('namespace=&gt;'Admin'),您的代码将运行良好。

      但是如果你想保留命名空间,那么有办法,

      <?php
      
      namespace App\Http\Controllers\Admin; \\Add the admin part.
      
      use App\Http\Controllers\Controller;
      
      class DashboardController extends Controller {
      
          public function index()
          {
              return \View::make('admin/dashboard');
          }
      }
      
      ?>
      

      现在,它可以访问了。

      注意 #1: 但这并不意味着 DashboardController 必须位于 admin 文件夹中

      事实上,它可以放在任何文件夹中。 只要您保持正确的命名空间,它与以前的版本相同。你需要做的就是,运行一个

      composer dump-autoload -o
      or
      php composer.phar dump-autoload -o
      

      composer 会在自动加载中添加文件。

      【讨论】:

      • 我会研究这方面的代码,但这对我来说很有意义。我相信 Laravel 也在研究文件夹结构。不过,从维护的角度来看,我建议将类放在与其命名空间相同的文件夹结构中。
      • 我正在使用 Laravel 5.1,composer dump-autoload -o 解决了我的问题。谢谢。
      猜你喜欢
      • 2015-10-16
      • 2016-09-14
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多