Класс 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');
}
....
}