Laravel 5.3+ 中的 Route::controller() 替代方案
Posted
技术标签:
【中文标题】Laravel 5.3+ 中的 Route::controller() 替代方案【英文标题】:Route::controller() alternative in Laravel 5.3+ 【发布时间】:2017-01-08 14:15:15 【问题描述】:我刚刚从 Laravel 5.2 升级到 5.3。我正在为我的应用程序中的几个表使用Laravel-DataTables 包。
升级后当我运行artisan serve
我收到:
[BadMethodCallException]
Method controller does not exist.
我已经在我的routes.php
(现在是web.php
)中将问题追溯到这段代码
Route::controller('datatables', 'ProfileController', [
'anyOrders' => 'datatables.dataOrders',
'anyProperties' => 'datatables.dataProperties',
]);
这是路由DataTables Documentation 查询的建议方式。
Route::controller()
是否已弃用,这些路线的替代方案是什么?
【问题讨论】:
【参考方案1】:你可以使用resource()。
Route::resource('users','UserController');
注意:不需要“get”前缀。 getIndex()
= index()
【讨论】:
【参考方案2】:我和你有同样的问题,没有一个替代方案(显式声明或发布)足够好。还有一些替代方案需要更改太多代码。
这就是为什么我编写了一个名为 AdvancedRoute 的类,它可以作为替代品。
只需将 Route::controller 替换为 AdvancedRoute::controller 即可使用,如下所示:
AdvancedRoute::controller('users','UserController');
如何在 GitHub 存储库中安装和使用 find 的完整信息:
https://github.com/lesichkovm/laravel-advanced-route
希望你觉得这很有用。
【讨论】:
【参考方案3】:明确的routes
将是:
Route::get('/datatables/orders', array('middleware' => 'auth', 'uses' => 'ProfileController@anyOrders'))->name('datatables.dataOrders');
Route::get('/datatables/properties', array('middleware' => 'auth', 'uses' => 'ProfileController@anyProperties'))->name('datatables.dataProperties');
【讨论】:
谢谢,解决了错误。我不得不删除'middleware'=>'auth'
。
@ArturGrigio 乐于助人
好的,所以我知道隐式路由在 5.3 中消失了。是否有一个包仍然可以在某个地方启用它?或者我该怎么做才能把它带回来? - 没有讨论为什么我不应该这样做...... :)【参考方案4】:
https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0
以下功能已在 5.2 中弃用,并将在 2016 年 6 月的 5.3 版本中删除:
使用Route::controller
的隐式控制器路由已被弃用。请在您的路由文件中使用显式路由注册。这可能会被提取到一个包中。
【讨论】:
错过了 :( 非常感谢 :) 我的用例的显式路由是什么? @ArturGrigio "请在您的路线文件中使用明确的路线注册。"以上是关于Laravel 5.3+ 中的 Route::controller() 替代方案的主要内容,如果未能解决你的问题,请参考以下文章
RouteCollection.php 第 161 行 Laravel 5.3 中的 NotFoundHttpException
Laravel 5.3 登录路由 - RouteCollection.php 中的 NotFoundHttpException