【问题标题】:Laravel route is forcing me to use a /doube/route and not /singleLaravel 路线迫使我使用 /double/root 而不是 /single
【发布时间】:2014-09-30 13:41:39
【问题描述】:

我遇到了一个奇怪的问题,但我并不完全理解......

这是我的路线:

Route::get('/app/signin', array( 'as' => 'account-login', 'uses' => 'AccountController@getLogin' ));

效果很好。但是,当我松开 /app 部分时,我得到一个错误。如果我把它改成

Route::get('/signin', array( 'as' => 'account-login', 'uses' => 'AccountController@getLogin' ));

我收到以下错误:

 * @throws \Symfony\Component\HttpKernel\Exception\HttpException
     * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
     */
    public function abort($code, $message = '', array $headers = array())
    {
        if ($code == 404)
        {
            throw new NotFoundHttpException($message);
        }
        else

任何帮助将不胜感激

** 更新 1 **

这是我的完整路线列表:

// ALL PUBLIC ACCESS ROUTES
Route::get('/', array( 'as' => 'home', 'uses' => 'HomeController@home' ));
Route::get('/{username}', array( 'as' => 'profile-user', 'uses' => 'ProfileController@user' ));


// UNAUTHENTICATED GROUP (GUEST - PUBLIC ACCESS WITH FORMS AND SIGNUP)
Route::group(array('before' => 'csrf'), function() {

    Route::post('/app/create', array( 'as' => 'account-create-post', 'uses' => 'AccountController@postCreate' ));
    Route::post('/app/login', array( 'as' => 'account-login-post', 'uses' => 'AccountController@postLogin' ));
    Route::post('/app/forgot-password', array( 'as' => 'account-forgot-password-post', 'uses' => 'AccountController@postForgotPassword' ));

});

Route::get('/app/forgot-password', array( 'as' => 'account-forgot-password', 'uses' => 'AccountController@getForgotPassword' ));
Route::get('/app/recover{code}', array( 'as' => 'account-recover', 'uses' => 'AccountController@getRecover' ));
Route::get('/app/signin', array( 'as' => 'account-login', 'uses' => 'AccountController@getLogin' ));
Route::get('/app/create', array( 'as' => 'account-create', 'uses' => 'AccountController@getCreate' ));
Route::get('/app/activate/{code}', array( 'as' => 'account-activate', 'uses' => 'AccountController@getActivate' ));


// AUTHENTICATED GROUP (WHEN USER IS LOGGED IN)
Route::group(array('prefix' => 'app', 'before' => 'auth'), function() {

    Route::group(array('before' => 'csrf'), function() {

        Route::post('/change-password', array( 'as' => 'account-change-password-post', 'uses' => 'AccountController@postChangePassword' ));

    });

    Route::get('/change-password', array( 'as' => 'account-change-password', 'uses' => 'AccountController@getChangePassword' ));
    Route::get('/signout', array( 'as' => 'account-sign-out', 'uses' => 'AccountController@getSignOut' ));

});

【问题讨论】:

  • 更新/保存更改后,我正在访问正确的 URL。这真的很奇怪,因为我可以使用 /s/signin、something/signin 等任何东西,但 /sign 会导致错误:/
  • 您还需要什么@delmadord?如果有帮助,我可以复制所有路线?
  • 您可以将其余路线添加到问题中吗?

标签: laravel laravel-4 laravel-routing


【解决方案1】:
Route::get('/{username}', array( 'as' => 'profile-user', 'uses' => 'ProfileController@user' ));

是问题所在,我建议通过在其前面添加一些内容来阐明这条路线,或者将其放在路线的底部,以便其他已定义的 one-word 路线首先被它们各自的路线捕获控制器。

还建议插入正则表达式(根据需要进行修改)

Route::pattern('username', '[a-z]+')

在该路线之前或使用 where 这样的子句

Roue::get( /* username */ )->where('username', '[a-z]+');

应该在每个路由参数上使用这种方法,以便更好地控制路由和数据操作。

旁注

防止用户使用您拥有的其他 one-word 路由的用户名,因为正如用户 @BarryWalsh 所建议的那样,它们将无法访问。

【讨论】:

  • 感谢工作!谢谢。所以我明白了是什么原因造成的?我正在创建的应用程序具有诸如 domian.com/profilename 之类的 URL,那么有没有更好的方法来调用该路由?我已将它添加到底部,并且效果很好。
  • 很好奇,您是否需要阻止用户注册与路线名称相同的名称?
  • 感谢@delmadord - 我在阅读您的回答后发现了这一点,这也有助于laravel-tricks.com/tricks/routing-patterns
  • Route::get('/{username}', ... 用作“catch all”路由,并为@delmadord 建议的username 添加一个模式会将所有捕获过滤到与[a-z]+ 匹配的那个@BarryWalsh 说得对您应该验证您的用户用户名,以便它们不会与您拥有的任何单字路由发生冲突。 Route::getRoutes() 返回一个 RouteCollection,您可以对其进行迭代并从中获取您的路线名称 - 我将创建一个自定义验证器来检查该列表中是否找不到输入。
  • 我想我还应该补充一点,路由系统将尝试将输入路径与路由系统注册的每个路由一个接一个地匹配。因此,将 Route::get('/{username}', ... 路由添加到路由配置的末尾也将起作用,除非如 @BarryWalsh 所述,用户与路由具有相同的用户名。
【解决方案2】:

这看起来确实很奇怪,但首先我会尝试看看是否从目标 URI 中删除前面的斜杠(因此 '/signin' 变为 'signin')可以解决问题,因为这些不是必需的。

【讨论】:

  • 这在 Laravel 4 中绝对没有效果。
猜你喜欢
  • 2014-06-13
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2012-11-02
  • 2017-07-09
  • 1970-01-01
相关资源
最近更新 更多