我的控制器位于与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\
部分。
这样的事情可能吗?
答案 0 :(得分:2)
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
});
答案 1 :(得分:1)
您可以为此目的使用路由中的命名空间:
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在App文件夹中,则无需在composer文件中添加任何内容,因为App文件夹在psr-4
中注册,并且这将加载所有此名称中的文件为您提供。
答案 2 :(得分:0)
对于“laravel 8” 这里我给出了一个带有命名空间和前缀的示例,但您也可以根据需要使用任何一个。
我使用命令在控制器目录中创建了控制器
<块引用>php artisan make:controller Admin/StoriesController
Route::namespace('Admin')->prefix('admin')->group(function(){
Route::get('/deleted_stories',
'\App\Http\Controllers\Admin\StoriesController@index')->name
('admin.stories.index');
});