我想添加逻辑以在用户登录用户的第一个配置文件ID时创建一个profile_id cookie。
setcookie("profile_id", Auth::user()->profiles[0]->id, time() + 86400, "/");
我已将此行放置在其他控制器中,所以我知道该部分可以工作,但是由于没有方法(更新/创建/等)可将该逻辑放入其中,因此我似乎无法“破解” loginController。
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/settings';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
我不确定此控制器正在发生什么,并且似乎无法弄清楚它是如何工作或正在做什么。任何理解该代码的指针或指导将不胜感激。
我选择不使用cookieController,因为该行有效,并且是该应用程序唯一需要的cookie。
如果功能的上下文对我有一个拥有许多配置文件的用户有用,则导航栏具有一个下拉菜单以选择活动的配置文件。导航栏(未下拉)显示基于profile_id cookie的当前所选用户。当用户首次登录时,没有选择任何配置文件,并且不存在profile_id cookie,因此它在登录时会中断。我通过重定向到没有导航栏的页面和一个逻辑块来解决这个问题,该逻辑块说如果不存在cookie,则创建一个cookie,但这不是一个长期的解决方案。
答案 0 :(得分:0)
有关AuthenticatesUsers
特性中包含的所有功能,请参见https://github.com/laravel/framework/blob/6.x/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php。
例如,您可以像这样覆盖login
函数:
LoginController.php
use AuthenticatesUsers {
// Rename one function to another name, so we can use the original name ourselves.
login as loginTrait;
}
public function login(Request $request)
{
// And here you can put your own logic, a good starting point is
// the source (the `AuthenticatesUsers::login()` function).
// Call the original function.
$this->loginTrait($request);
}
此外,还有一个protected function authenticated(Request $request, $user)
定义,您可以自由覆盖。验证用户身份后将调用此方法。
答案 1 :(得分:0)
我将覆盖authenticated
方法,并在其中添加您的逻辑:
/**
* The user has been authenticated.
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return mixed
*/
protected function authenticated(Request $request, $user)
{
redirect()->intended($this->redirectPath())->cookie(
'profile_id', $user->profiles[0]->id, now()->addSeconds(86400)
);
}
之所以起作用,是因为一旦通过身份验证,它将击中sendLoginResponse
(在Trait中定义),并调用authenticated
函数。该函数默认为空,因此它返回null
并触发null coalesce
中的sendLoginResponse
比较。我们在这里所做的是复制该方法的逻辑,并添加了一个cookie以与响应一起返回。
答案 2 :(得分:0)
AuthenticatesUsers::sendLoginResponse
在验证用户身份后返回RedirectResponse
。
一种直接的方法是覆盖sendLoginResponse
并通过ResponseTrait::cookie
将cookie包含在原始响应标头中。
use Symfony\Component\HttpFoundation\Cookie;
class LoginController extends Controller
{
use AuthenticatesUsers;
#...
/**
* Send the response after the user was authenticated.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
protected function sendLoginResponse(Request $request)
{
return parent::sendLoginResponse($request)
->cookie(
new Cookie(
"profile_id",
Auth::user()->profiles[0]->id,
time() + 86400,
"/"
)
);
}
}