Laravel 5: как поместить контроллеры администратора в папку?

Я создаю свою первую панель администратора в 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 не существует

Какие-либо предложения? Спасибо!


person clone45    schedule 19.03.2015    source источник


Ответы (3)


Laravel 5 гораздо более строго придерживается стандартов пространства имен, чем предыдущие версии Laravel.

Это означает, что изменение структуры папок также меняет пространство имен, в котором автозагрузчик ищет класс.

В этом случае вы добавили пространство имен Admin в свой DashboardController.

Ваша декларация namespace App\Http\Controllers; должна быть изменена на

namespace App\Http\Controllers\Admin;

Аналогичным образом, если вы внесете дополнительные изменения в структуру папок, например, добавите новую подпапку в разделе «Администратор» для SuperAdmin, вам потребуется добавить это пространство имен к классам в этой папке. Это относится и к другим папкам, таким как Handlers, Events и т. д.

Если вы начнете изменять структуру папок, лучше всего понять концепцию пространства имен для PHP. Вот хороший учебник для быстрого изучения: http://daylerees.com/php-namespaces-explained

person Adam Link    schedule 19.03.2015
comment
@clone45, однако, это принятый ответ, но содержание неверно. вам не нужно следовать какой-либо специальной структуре папок. вы можете поместить класс в любую папку, которую хотите. но вам просто нужно убедиться, что ваше пространство имен отслеживается композитором, и при дампе соответствующая запись попадает в autoload_classmap.php. пока композитор может его найти, он включит его для вас независимо от того, в какой папке он находится. - person itachi; 19.03.2015

существует заблуждение, что 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

и композитор добавит файл в автозагрузку.

person itachi    schedule 19.03.2015
comment
Я посмотрю на этот код, но для меня это имеет смысл. Я был уверен, что Laravel также смотрит на структуру папок. Однако с точки зрения обслуживания я бы предложил поместить классы в ту же структуру папок, что и их пространство имен. - person Adam Link; 19.03.2015
comment
Я использую Laravel 5.1 и composer dump-autoload -o решил мою проблему. Спасибо. - person salep; 17.08.2015

попробуйте следующий код с именем папки в пространстве имен, вы должны использовать папку в качестве пространства имен, т.е. имя папки следует за именем папки в качестве пространства имен 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'));
});
person Anand Patel    schedule 19.03.2015