我使用Laravel 5.4和预先构建的auth库。
当用户成功登录时,我想提出一个甜蜜警报(或弹出窗口),但我无法找到重定向发生的逻辑位置。
所以:
用户成功登录
转发到家庭控制器(需要在代码中找到这个并附加一条flash消息或其他东西?)
在我的视图中,检测是否有闪存消息并在内存中发出闪存消息,以便我可以使用Javascript查询并显示警告框。
编辑:
我已经有了这套装置,没关系:
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/';
但我需要找到引用它的位置?并添加一条Flash消息
由于
答案 0 :(得分:4)
在方法RedirectsUsers
中的特征redirectPath()
中引用了该属性。该特征用于AuthenticatesUsers
中使用的特征LoginController
。
话虽如此,你需要做的很简单。在登录控制器中,我们需要覆盖特征中的方法,以便它还将消息闪烁到会话。但由于该方法具有特征,我们不想仅仅覆盖它,我们仍然希望在特征中使用该方法,因此我们首先需要将其替换为其他方法。
use AuthenticatesUsers {
redirectPath as laravelRedirectPath;
};
现在我们可以安全地覆盖此方法以将数据刷新到会话。
/**
* Get the post register / login redirect path.
*
* @return string
*/
public function redirectPath()
{
// Do your logic to flash data to session...
session()->flash('message', 'your message');
// Return the results of the method we are overriding that we aliased.
return $this->laravelRedirectPath();
}
如果您不想完成此操作,您可以做的另一件事就是收听auth.login
事件,并在处理程序中闪存数据。
答案 1 :(得分:3)
app/Http/Controllers/Auth/LoginController.php
以引用HomeController路线并闪烁消息: use Session;
protected $redirectTo = '/home'; // add your route here
/**
* The user has been authenticated.
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return mixed
*/
protected function authenticated(Request $request, $user)
{
$request->session()->flash('flash_notification.success', 'Congratulations, you have cracked the code!');
return redirect()->intended($this->redirectPath());
}
然后,在您的视图中添加以下内容:
@if (session()->has('flash_notification.success')) <div class="alert alert-success">{!! session('flash_notification.success') !!}</div>
@endif
最后,请确保为css包含引导程序
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
答案 2 :(得分:0)
如果您想让用户使用ajax登录并在成功登录后发送Flash消息,然后重新加载/重定向,则必须对Auth\Login Controller
将这两个方法添加到Auth\Login Controller
,第一个方法将在成功登录时发送响应,而第二个方法将产生错误消息。
protected function sendLoginResponse(Request $request) {
$request->session()->regenerate();
$this->clearLoginAttempts($request);
if ($request->ajax()) {
return response()->json($this->guard()->user(), 200);
}
return $this->authenticated($request, $this->guard()->user())
?: redirect()->intended($this->redirectPath());
}
protected function sendFailedLoginResponse(Request $request)
{
if ($request->ajax()) {
return response()->json([
'error' => Lang::get('auth.failed')
], 401);
}
return redirect()->back()
->withInput($request->only($this->username(), 'remember'))
->withErrors([
$this->username() => Lang::get('auth.failed'),
]);
}
然后使用jQuery(如果你使用它),你可以这样做
var fdata = $("#loginForm").serialize();
var furl = $("#loginForm").attr( "action" );
$.ajax({
url: furl,
type: "POST",
data: fdata,
success: function(data){
console.log("Login Success");
location.reload();
},
error: function(data){
var errors = data.responseJSON;
if(errors.error){
console.log(errors.error);
}
}
});
当然,如果您希望在服务器上设置自定义错误/ flash消息,可以将其添加到响应json。
希望它有所帮助。