Laravel не сохраняет никаких данных в сеансе в промежуточном классе - PullRequest
0 голосов
/ 01 июля 2018

Я хочу сохранить IP-адрес посетителя только один раз в базе данных, по этой причине я создал промежуточное ПО и попытался сохранить IP-адрес пользователя, используя $ request-> 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 голосов
/ 01 июля 2018

Какой драйвер сеанса вы используете? Если 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...