Laravel将控制器方法与另一个控制器路由混淆。
Laravel将控制器方法与另一个控制器路由混淆。
假设我有两个URL:\n
- \n
- localhost/backend/admin
- localhost/backend/admin/users
\n
\n
\n在我的routes.php文件中,我会有一个路由如下:\n
Route::group(array('prefix' => 'backend', 'before' => 'auth'), function(){ // 我在这个控制器上有一些方法,例如:getIndex,postUpdate等... Route::controller('admin', 'AppBackend\Controllers\Admin\AdminController'); // 我在这个控制器上有一些方法,例如:getIndex,postUpdate等... Route::controller('admin/users', 'AppBackend\Controllers\Admin\Users\UsersController'); });
\n问题是,当我在浏览器中输入admin/users时,Laravel认为我正在尝试调用AdminController上的一个方法,但发现在我为该控制器定义的方法中找不到。 似乎更理想的是,如果找不到方法,Laravel会继续向下查找路由文件,并命中我的admin/users路由,并调用UsersController。\n我不完全满意的两个可能解决方案:\n
- \n
- 反转路由的顺序。这样读起来不太自然。而且,我不知道这个解决方案在未来的每个情况下会如何持续。
- 切换到使用资源路由。我不喜欢在一些浏览器不支持的情况下使用PUT/DELETE。我喜欢使用自己的一组动作词(仅仅重命名和添加到默认资源中不够或变得笨重)。另请参见使用Laravel时使用PUT/DELETE的价值是什么?
\n
\n
\n还有其他好的解决方案吗?
问题的出现原因是Laravel混淆了控制器方法和另一个控制器的路由。这可能是因为在路由列表中,控制器方法和控制器路由的定义方式相似,导致Laravel无法正确地区分它们。
解决方法是明确指定控制器方法的路由名称,以确保它们不会与其他控制器的路由混淆。可以使用['as' => 'route.name', 'uses' => 'Controller@method']
的方式来定义控制器方法的路由,其中'route.name'
是控制器方法的路由名称。
以下是一种可能的解决方法的示例:
Route::get('example', ['as' => 'example.route', 'uses' => 'ExampleController@exampleMethod']);
通过指定路由名称,可以确保在创建控制器方法的路由时不会与其他控制器的路由发生混淆,从而解决了Laravel混淆控制器方法和另一个控制器路由的问题。
希望这个解决方法对你有帮助!