我使用的是 Laravel 10,这段代码位于我的 web.php 文件中
...
Route::resource('photos', PhotoController::class);
....
它会生成以下路线列表:
photos ............................ photos.index › Admin\PhotoController@index
photos ............................ photos.store › Admin\PhotoController@store
photos/create ..................... photos.create › Admin\PhotoController@create
photos/{photo} .................... photos.show › Admin\PhotoController@show
photos/{photo} .................... photos.update › Admin\PhotoController@update
photos/{photo} .................... photos.destroy › Admin\PhotoController@destroy
photos/{photo}/edit ............... photos.edit › Admin\PhotoController@edit
一切正常。现在,我想通过身份验证来保护此页面,并且我使用此代码
Route::prefix('admin')->middleware('auth')->group(function () {
Route::get('photos', PhotoController::class);
});
我收到此错误:
Target class [PhotoController] does not exist.
所以我添加:->namespace('App\Http\Controllers\Admin')
Route::prefix('admin')->namespace('App\Http\Controllers\Admin')->middleware('auth')->group(function () {
Route::resource('photos', PhotoController::class);
});
现在网站可以工作了,但是命令 php artisan route:list 说:
Class "PhotoController" does not exist
我必须指定:
use App\Http\Controllers\Admin\PhotoController;
问题是..哪个是正确的方法?使用命名空间还是用 ->namespace() 表示?
最佳实践是在顶部导入命名空间
use App\Http\Controllers\Admin\PhotoController;
这就是 Laravel 从旧字符串语法转变的原因(它仍然受支持,但不再是 Laravel 团队的最佳实践):
Route::get('/action', 'SomeController@action')
新语法(从 Larave 8 开始支持):
use App\Http\Controllers\Path\SomeController;
Route::get('/action', [SomeController::class, 'action'])
查看 Laravel 控制器文档示例 here 和 here。
这样做的好处是:
->namespace('...')
那样链接或使用它。