Laravel将控制器方法与另一个控制器路径混淆

时间:2014-03-12 16:44:25

标签: php laravel laravel-4 laravel-routing

假设我有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我不满意的可能解决方案:

  1. 撤消路线的顺序。从上到下,这不会像我希望的那样自然地阅读。另外,我不知道这个解决方案将如何随着时间的推移而持续下去。
  2. 切换到使用资源路由。当某些浏览器不支持时,我不喜欢使用PUT / DELETE。我喜欢拥有自己的一组动作词(简单地重命名和adding to the default resources is not enough or becomes clunky)。另请参阅What is the value of using PUT/DELETE with Laravel?
  3. 还有其他好的解决方案吗?

1 个答案:

答案 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(),因为我喜欢有时读取我的路线文件,这个方法可能只在一大堆路线后才能看到。