Класс App\Http\Controllers\StudentController не существует в Laravel 5

Я строю модуль под названием Студент в Ларавеле.

Я использую файл rout.php внутри папки Student, чтобы записать маршруты для модуля Student.

Когда я использую только Route::get('/list', function () { return view('welcome');}); Программа работает нормально без ошибок.

Но когда я использую Route::get('/list', 'StudentController@list'); есть ошибка.

Ошибка есть,

Класс App\Http\Controllers\StudentController не существует

Структура папок

Студенческий контроллер

namespace App\Student\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class StudentController extends Controller
{
    public function list(){
        echo "Hello"
    }
}

Студенческий поставщик услуг

namespace App\Student;

use App\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;

class StudentServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Define the routes for the application.
     *
     * @internal param Router $router
     */

    public function map()
    {
        Route::group([
            'namespace' => $this->namespace,
            'prefix' => 'students',
        ], function ($router) {
            require __DIR__ . '/routes.php';
        });
    }
}

5 ответов

Решение

Хотя laravel иногда бывает волшебством, он работает, только если вы придерживаетесь конфигурации и соглашений по умолчанию.

Вы можете разместить свои контроллеры в любом месте (черт, даже загрузить из базы данных и eval их), но вы должны изменить конфигурацию соответственно.

Я подозреваю, что в RouteServiceProvider настроено неверное пространство имен. По умолчанию это App\Http\Controllers,

Изменение папки по умолчанию

Если все ваши контроллеры будут в одной папке, измените ее на App\Student\Controllers и забудь об этом.

class RouteServiceProvider extends ServiceProvider
{
    // ...
    protected $namespace = 'App\Student\Controllers';
    // ...
}

Несколько модулей

Если вы хотите иметь несколько модулей, измените конфигурацию пространства имен RotueServiceProvider на App а в файлах маршрута используй Student\Controllers\StudentController@list

class RouteServiceProvider extends ServiceProvider
{
    // ...
    protected $namespace = 'App';
    // ...
}

Route::get('/list', 'Student\Controllers\StudentController@list');

Перейдите к RouteServiceProvider.php и измените пространство имен по умолчанию

protected $namespace = 'App\Http\Controllers';

Это дает вам эту ошибку, потому что контроллер не может найти класс, который вы вызываете.. в верхней части вашего контроллера добавить

use App\Student;

чтобы заставить это работать..

Вы создаете контроллер в неправильном месте. Расположение контроллера по умолчанию:

app/Http/Controllers

Попробуйте переписать ваш маршрут следующим образом:

 Route::get('/list', '\App\Student\Controllers\StudentController@list');

Надеюсь, это поможет вам:)

Та же проблема возникает, когда вы перемещаете ранее созданный контроллер в другую папку внутри папки контроллеров:

|Controllers
|Controller.php
|--|Setup [Folder]
    |MovedController.php

Просто убедитесь, что пространство имен правильное, и импортируйтеController.php

namespace App\Http\Controllers\Setup;
use App\Http\Controllers\Controller;

Ваш контроллер находится в неправильном месте. Должно быть внутри app/Http/Controllers/,

Вы можете сделать дальнейшую папку Student внутри app/Http/Controllers/ и расширение основного контроллера для создания изолированного модуля Student.

Ваша файловая структура должна понравиться:

app[dir]
----Http[dir]
-------Controllers[dir]
----------Student[dir]
----------Controller.php[file]

Ваш Студенческий Контроллер должен выглядеть так:

namespace App\Http\Controllers\Student;

use App\Http\Controllers\Controller;

class StudentController extends Controller
{

    public function __construct()
    {
        $this->middleware('auth');
    }

   ....
}
Другие вопросы по тегам