关于 Laravel 8 中路由控制器命名空间的变更(附带还原方法)
随着 Laravel 8 的发布,路由语法发生了变化,这也许会让您大吃一惊,至少对我而言是如此。 它并没有在升级指南的影响变化中体现,所以为阅读到了最后,又回到了我的困扰。
在新的laravel 8 安装中,我的 web.php
文件中包含以下文件:
Route::get('/', 'HomeController@index');
这是在 HomeController.php
的 index 方法:
/**
* 显示资源列表
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('welcome');
}
这应该是非常熟悉的,并且当我们访问 /
路由时我们希望能看到一个视图。然而我们看到的是一个错误页面。
你可能会以为自己写错了代码,但没有。在 laravel 8 中,该语法在默认情况下不起作用。 在 升级指南 中提到过,但是影响的可能性是可选的 🤨。 尽管提到了这一点:
在大多数情况下,这不会影响升级的项目,因为 RouteServiceProvider 仍将包含 $namespace 属性及其先前的值。但是,如果通过创建全新的 Laravel 项目升级项目,则可能会遇到重大变化。
在laravel 8中定义路由的方法是:
use App\Http\Controllers\HomeController;
// 使用 PHP 可调用的语法
Route::get('/', [HomeController::class, 'index']);
或者
// 使用字符串语法...
Route::get('/', 'App\Http\Controllers\HomeController@index');
资源路由变为
Route::resource('/', HomeController::class);
这意味着在laravel 8 中,默认情况下没有自动控制器声明前缀。
如果要坚持旧方法,则需要在 RouteServiceProvider.php
中添加一个命名空间属性(该属性在以前的版本中存在)并在 route 方法中激活。
/**
* 该命名空间将应用于你的控制器路由
*
* 另外,它被设置为 URL 生成器的根命名空间
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';
// 编辑 boot 方法
/**
* 定义您的路由模型绑定,模式过滤器等
*
* @return void
*/
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
});
回顾一下,在laravel 8 中,你可以使用新的语法来定义你的路由或坚持使用旧的方式。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
虽然老得看起来更加习惯一些,但是用新的其实更加顺手。最头疼的估计就是存量项目
大佬,你下面是写重复了吗
在api中不起效果
laravel9下命名空间完全用不了了吗?修改了默认路由加载前缀也不行了。