Laravel 5:如何将管理员控制器放在一个文件夹中?

时间:2015-03-19 17:43:01

标签: routes namespaces laravel-5 controllers

我在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时,我得到的错误是:

  

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

有什么建议吗?谢谢!

3 个答案:

答案 0 :(得分:3)

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

但是不,它没有

您的代码存在问题:

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

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

如果您删除此array('namespace=>'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将在autoload中添加该文件。

答案 1 :(得分:2)

Laravel 5对以前版本的Laravel的命名空间标准有更严格的遵守。

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

在这种情况下,您已将命名空间Admin添加到DashboardController。

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

namespace App\Http\Controllers\Admin;

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

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

答案 2 :(得分:0)

尝试在命名空间中使用文件夹名称的代码,您必须使用文件夹作为命名空间,即它遵循文件夹名称作为命名空间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'));
});