Laravel 5.1 - 如何在AuthController中设置登录路径?

3
我可以帮您将默认的Laravel路由从/auth/login更改为只有/login,同样也可以对注册进行相应的修改。
以下是我的路由信息:
Route::get('login',     ['as' => 'getLogin', 'uses' => 'Auth\AuthController@getLogin']);
Route::post('login',    ['as' => 'postLogin', 'uses' => 'Auth\AuthController@postLogin']);
Route::get('logout',    ['as' => 'getLogout', 'uses' => 'Auth\AuthController@getLogout']);
Route::get('register',  ['as' => 'getRegister', 'uses' => 'Auth\AuthController@getRegister']);
Route::post('register', ['as' => 'postRegister', 'uses' => 'Auth\AuthController@postRegister']);

现在问题来了,当用户尝试访问一个受保护的区域时,Authentication 类起作用,将未经身份验证的用户重定向回/auth/login而非仅仅是/login
我曾尝试通过以下方式在我的AuthController中设置$loginPath来解决这个问题:
protected $loginPath = '/login';

但是似乎 $loginPath 只用于登录失败的情况,而不是像在 AuthenticateUsers Class 中记录的认证失败的情况。

我成功地从以下位置更改了 Authenticate Class 中的 redirectURL:

return redirect()->guest('auth/login');

转换为:

return redirect()->guest('login');

这解决了问题,但我想在我的AuthController中设置一个属性,就像这样:

protected $redirectIfMiddlewareBlocks = '/login';

为此,我在认证类中检查一个属性是否存在,该属性是我在AuthController中设置的:

return redirect()->guest(property_exists($this, 'redirectIfMiddlewareBlocks') ? $this->redirectIfMiddlewareBlocks : '/shouldnotbeused');

然而我得到了/shouldnotbeused的url,而不是在我的AuthController中设置的redirectIfMiddlewareBlocks属性。

我该如何正确地设置登录路由的路径呢?


1
你为什么要检查它是否存在?你知道它存在,因为你刚刚添加了它。 - andrewtweber
1
据我所记,那些是您需要设置登录路径的唯一两个位置。但我不明白为什么要通过设置属性并检查其是否存在来过于复杂化问题。我会选择可行的方式 redirect()->guest('login') - andrewtweber
嗯,我只是稍微重构了一下代码,并认为将此路径保存在顶部的某个变量中是一个好主意。我检查它是否存在以查看它是否被找到,但实际上并没有找到。 - LoveAndHappiness
1
但是为什么要检查呢?这个属性会不存在吗? - andrewtweber
看看它是否实际接受在authcontroller中设置的属性。但它没有。我也理解你问题的含义。你是在问为什么要检查属性是否存在,如果你首先设置它。嗯,我读了一些特性并得到了这个想法,给类的用户提供设置一个与默认值不同的属性的选项是无害的,然后可能根本不设置它。但这个选项应该存在。希望你明白了... - LoveAndHappiness
是的,如果这不够清楚,我很抱歉:我想问题并不是非常严重。最初,我认为能够在一个地方定义所有路径会很好。 - LoveAndHappiness
1个回答

4
我认为问题在于您检查的属性所在的类错误。 您正在检查$this上是否存在该属性,而 Authenticate 的实例上设置了它,而不是在 AuthController 上。
因此,您应该将您的检查更改为:
property_exists(AuthController::class, 'redirectIfMiddlewareBlocks')

另外,您无法从另一个类访问受保护的属性。如果要这样做,您必须将其设置为公共属性。最后,我建议将其设置为静态属性,以便您无需实例化AuthController对象即可访问它。因此,最终解决方案如下:

class AuthController {
    public static $redirectIfMiddlewareBlocks = '/here';
}

在您的身份验证中间件中:
use App\Http\Controllers\AuthController;

class Authenticate {
    public function handle() {
        return redirect()->guest(
            property_exists(AuthController::class, 'redirectIfMiddlewareBlocks')
                ? AuthController::$redirectIfMiddlewareBlocks
                : '/shouldnotbeused'
        );
    }
}

非常感谢你,安德鲁。 - LoveAndHappiness
1
@LoveAndHappiness 不用谢。对不起,我一开始误解了。我以为你在做的事情毫无意义,但实际上,我认为你所做的是个好主意,正如你所说,将所有重定向路径放在一个地方。 - andrewtweber
还有一个问题。使用您的解决方案后,我得到了以下错误:未定义常量AuthController - 假定为'AuthController'。 - LoveAndHappiness
1
@LoveAndHappiness 嗯,是的,请查看我的更新。property_exists需要类名,所以我将其更改为AuthController::class。 - andrewtweber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接