如何在Laravel中用户登录时设置会话变量

Kar*_*hik 2 php session-variables laravel laravel-5 laravel-5.3

使用Laravel进行发票应用程序开发.我为settings表中的每个用户存储日期和金额格式.

当用户登录他们的帐户时如何设置Session变量?请提出任何建议.我正在使用Laravel 5.3.

Sha*_*rom 10

当然,文档告诉我们如何存储会话数据*,但它们没有解决OP关于在登录时存储会话数据的问题.您有几个选项,但我认为最明确的方法是覆盖AuthenticatesUsers特征的经过身份验证的方法.

将覆盖添加到LoginController:

/**
 * The user has been authenticated.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  mixed  $user
 * @return mixed
 */
protected function authenticated(Request $request, $user)
{
    $this->setUserSession($user);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将会话设置为:

protected function setUserSession($user)
{
    session(
        [
            'last_invoiced_at' => $user->settings->last_invoiced_at,
            'total_amount_due' => $user->settings->total_amount_due
        ]
    );
}
Run Code Online (Sandbox Code Playgroud)

如果您想要更聪明一点,可以为Login或Authenticated事件创建一个监听器,并在其中一个事件*触发时设置会话.

创建一个侦听器,例如SetUpUserSession:

<?php

namespace app\Listeners;

use Illuminate\Auth\Events\Login;

class SetUserSession
{
    /**
     * @param  Login $event
     * @return void
     */
    public function handle(Login $event)
    {
        session(
            [
                'last_invoiced_at' => $event->user->settings->last_invoiced_at, 
                'total_amount_due' => $event->user->settings->total_amount_due
            ]
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

*链接转到5.4,但这与5.3没有变化.


Sek*_*nda 1

您可以使用两种不同的方法在会话中存储数据:Request 实例或使用提供的全局帮助器/函数。

请求实例

public function methodA(Request $request) {
    $request->session()->put('KEY', 'VALUE');
}
Run Code Online (Sandbox Code Playgroud)

全球帮手

public function methodB() {
    session(['key' => 'value']);
}
Run Code Online (Sandbox Code Playgroud)

您可以在文档中找到有关这两种方法的更多详细信息。