首页 文章

登录laravel后的Flash消息

提问于
浏览
3

我正在使用Laravel 5.4和预先构建的auth库 .

当用户成功登录时,我想有一个甜蜜的警报(或弹出窗口),但我无法找到重定向发生的逻辑位置 .

所以:

用户登录成功

获取转发到家庭控制器(需要在代码中找到这个并附加一条Flash消息或其他什么?)

在我的视图中检测是否有闪存消息并在内存中创建一个flash消息,然后我可以使用Javascript查询并显示一个警告框 .

编辑:

我已经有了这套装,很好:

use AuthenticatesUsers;

/**
 * Where to redirect users after login.
 *
 * @var string
 */
protected $redirectTo = '/';

但我需要找到引用它的位置?并添加一条Flash消息

谢谢

3 回答

  • 0

    该属性在方法 redirectPath() 中的特征 RedirectsUsers 中引用 . 该特征用于 LoginController 中使用的特征 AuthenticatesUsers .

    话虽如此,你需要做的是相当简单 . 在登录控制器中,我们需要覆盖特征中的方法,以便它还将消息闪烁到会话 . 但由于该方法属于特征,我们不仅仅想要覆盖它,我们仍然希望在特征中使用该方法,因此我们首先需要将其别名为别名 .

    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 事件,并在你的处理程序中,在那里闪存数据 .

  • 4
    • 编辑你的 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包含bootstrap <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
  • 3

    如果您想让用户使用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 .

    希望能帮助到你 .

相关问题