假设我有2个网址:
在我的routes.php中,我的路线看起来像这样:
Route::group(array('prefix' => 'backend', 'before' => 'auth'), function(){
// Some methods I have on this controller are: getIndex, postUpdate, etc...
Route::controller('admin', 'AppBackend\Controllers\Admin\AdminController');
// Some methods I have on this controller are: getIndex, postUpdate, etc...
Route::controller('admin/users', 'AppBackend\Controllers\Admin\Users\UsersController');
});
问题在于,当我在浏览器中输入 admin / users 时,Laravel认为我正在尝试在 上调用方法AdminController ,发现它在我对这个控制器的方法中不存在。如果没有找到方法,Laradvel继续沿着路线文件并点击我的 admin / users 路线并调用 <似乎会更理想EM> UsersController
2我不满意的可能解决方案:
还有其他好的解决方案吗?
答案 0 :(得分:3)
到目前为止,做路线的最佳方法是逐个手动完成。 In this article菲尔·斯特金推动我开始做到这一点,我终于意识到我在使用足智多谋和安宁的时候有点麻烦。
最好控制您的路线列表。资源丰富的控制器添加了太多的信息,比如路由参数,并且为了使资源丰富的控制器不创建一堆我不使用的路由,我必须过滤应该生成的内容。最后,每次在我的应用程序上创建功能时,创建一条路径都会更容易。
据我所知,为了按照正确的顺序处理你所有的路线,Laravel会建立一个你的路线列表,如果我们手动完成它的话。因此,手动执行它们不会有性能损失。
这是我刚刚开始的应用程序中的路由示例:
// Firewall Blacklisted IPs blocked from all routes
Route::group(['before' => 'fw-block-bl'], function()
{
Route::group(['namespace' => 'Application\Controllers'], function()
{
// Pretty error message goes to this route
Route::get('error', ['as' => 'error', 'uses' => 'Error@show']);
Route::get('coming/soon', ['as' => 'coming.soon', 'uses' => 'ComingSoon@index']);
Route::post('coming/soon', ['as' => 'coming.soon.post', 'uses' => 'ComingSoon@register']);
Route::get('coming/soon/register', ['as' => 'coming.soon.register', 'uses' => 'ComingSoon@register']);
Route::post('coming/soon/audit', ['as' => 'coming.soon.audit', 'uses' => 'ComingSoon@audit']);
Route::get('coming/soon/activate/{code}', ['as' => 'coming.soon.activate', 'uses' => 'ComingSoon@activate']);
// Whitelisted on firewall will have access to those routes,
// otherwise will be redirected to the coming/soon page
Route::group(['before' => 'fw-allow-wl'], function()
{
Route::get('user/activate/{code}', ['as' => 'user/activate', 'uses' => 'User@activate']);
Route::get('user/activation/send/{email?}', ['as' => 'user/activation', 'uses' => 'User@sendActivation']);
Route::get('login', ['as' => 'login', 'uses' => 'Logon@loginForm']);
Route::post('login', ['as' => 'login', 'uses' => 'Logon@doLogin']);
Route::get('logout', ['as' => 'logout', 'uses' => 'Logon@doLogout']);
Route::get('register', ['as' => 'register', 'uses' => 'Register@registerForm']);
Route::get('user/recoverPassword/{code}', ['as' => 'user/recoverPassword', 'uses' => 'User@recoverPassword']);
Route::post('user/changePassword', ['as' => 'user/changePassword', 'uses' => 'User@changePassword']);
// Must be authenticated
Route::group(['before' => 'auth'], function()
{
Route::get('/', ['as' => 'home', 'uses' => 'Home@index']);
Route::get('profile', ['as' => 'profile', 'uses' => 'User@profile']);
Route::group(['prefix' => 'offices'], function()
{
Route::get('/', ['uses' => 'Offices@index']);
Route::get('create', ['uses' => 'Offices@create']);
});
Route::group(['prefix' => 'users'], function()
{
Route::get('/', ['uses' => 'Users@index']);
Route::get('create', ['uses' => 'Users@create']);
});
});
});
});
});
所有控制器都将在Application\Controllers
中命名,并且所有方法(或子路由)都是前缀。
修改强>
我开始认为我也没有命名我的路线,我并没有真正使用它们,但我仍然不确定这一点,所以在这个原始示例中路线名称并不是很清楚。有些人还有一个可以删除的“用途”,一旦我决定使用姓名,他们就会立即删除。
编辑2
我没有在路线中做->before()
,因为我喜欢有时读取我的路线文件,这个方法可能只在一大堆路线后才能看到。