在中间件类中,Laravel无法在会话中保存任何数据

时间:2018-06-30 21:47:11

标签: php laravel

我只想在数据库中保存一次访问者IP地址,因此我创建了一个中间件并尝试使用$ request-> ip保存用户IP地址。但是问题是数据总是在数据库中重复,以避免这种情况我试图用Laravel会话创建一个布尔标志,以检查当前用户的IP地址是否保存在数据库中?但是Laravel在Laravel会话中没有保存任何内容,因此数据在数据库中重复。 我的代码是:

namespace App\Http\Middleware;

use App\Repositories\Contracts\VisitorRepositoryInterface;
use Closure;
use Session;

class VisitorMiddleware
{
    private $visitorRepository;

    public function __construct(VisitorRepositoryInterface $visitorRepository)
    {
        $this->visitorRepository = $visitorRepository;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!session('visited', false)) {
            $this->visitorRepository->create([
                'ip' => $request->ip(),
            ]);
            session(['visited' => true]);
            session()->save();
        }
        return $next($request);
    }
}

我也尝试用:

保存
$request->session()->put('visitors', true);

但是没有机会!

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您正在使用哪个会话驱动程序?如果为array,则该会话将不会在请求之间持续存在。至于重复的数据,您根本不需要会话,而是直接检查数据库中的IP地址,如果不存在则保存它:

public function handle($request, Closure $next)
{
    $exists = $this->visitorRepository->where([
        'ip' => $request->ip(),
    ])->exists();

    if (!$exists) {
        $this->visitorRepository->create([
            'ip' => $request->ip(),
        ]);
    }

    return $next($request);
}

// simplified further using eloquent's firstOrCreate
public function handle($request, Closure $next)
{
    $this->visitorRepository->firstOrCreate([
        'ip' => $request->ip(),
    ]);

    return $next($request);
}