У меня контроллеры в папке, отличной от родной для Laravel App\Http\Controllers. Я использую специальную папку Lib\MyApp, в которой есть модули. У каждого модуля свои контроллеры, модели и т. Д. Я добавил в composer.json автозагрузку в app\lib.

Я изменил пространство имен RouteServiceProvider:

protected $namespace = 'App\Lib\MyApp';

Я сделал composer dump-autoload после всего.

Внутри MyApp находится папка Landing\Controller с фактическим классом контроллера внутри.

Попробуйте 1 (идеально):

Я хотел бы назвать свой маршрут так:

Route::get('/', 'Landing\Controller\LandingController@index');

Но таким образом я получаю ReflectionException, что класс не найден, хотя

Попробуйте 2:

Route::get('/', '\Landing\Controller\LandingController@index');

Завершающая косая черта избавляет от части пространства имен, когда я обновляю страницу, а класс по-прежнему считается не существующим.

Попробуйте 3:

Route::get('/', 'MyApp\Landing\Controller\LandingController@index');

Это просто дублирует папку MyApp, а класс не найден должным образом.

Попробуйте 4 (работает, но не хотите, чтобы это было так)

Route::get('/', '\MyApp\Landing\Controller\LandingController@index');

Это работает нормально, хотя я хотел бы избавиться от части \MyApp\.

Возможно ли что-то подобное?

2
Norgul 22 Ноя 2017 в 11:49

2 ответа

Лучший ответ

Для этой цели вы можете использовать пространство имен в маршрутах:

Route::namespace('Landing\Controller')->group(function () { 
    Route::get('/', 'LandingController@index'); 
    // + other routes in the same namespace 
});

И не забудьте добавить пространство имен к контроллерам:

<?php namespace App\Lib\MyApp\Landing\Controller;

PS: в случае, когда Lib находится внутри папки приложения, нет необходимости добавлять что-либо в файл композитора, потому что папка приложения зарегистрирована в psr-4, и с этим он загрузит все файлы в этом namespase для вас.

4
Maraboc 22 Ноя 2017 в 10:25

Есть много способов добавить пространство имен в Laravel

Route::group(['prefix' => 'prefix','namespace'=>'Admin'], function () {
    // your routes with"App\Http\Controllers\Admin" Namespace
});

Route::namespace('Admin')->group(function () {
    // your routes with"App\Http\Controllers\Admin" Namespace
});

//single route
Route::namespace('Admin')->get('/todo', 'TaskController@index');

//single route
Route::get('/todo', 'Admin/TaskController@index');


// by ->namespace
Route::prefix('admin')->namespace('Admin')->group(function () {
    // route code
});
2
Dilip Hirapara 17 Фев 2021 в 13:44