Глобальное промежуточное ПО Laravel обнаружено, но не изменяет записи модели

У меня есть следующее промежуточное ПО (LastSeen):

<?php

namespace App\Http\Middleware;

use Closure;
use Carbon\Carbon;
use Illuminate\Contracts\Auth\Factory as Auth;

class LastSeen
{
     /**
     * The authentication factory instance.
     *
     * @var \Illuminate\Contracts\Auth\Factory
     */
     protected $auth;

     /**
     * Create a new middleware instance.
     *
     * @param  \Illuminate\Contracts\Auth\Factory  $auth
     * @return void
     */
     public function __construct(Auth $auth)
     {
         $this->auth = $auth;
     }
     /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
         if ($this->auth->check()) {
             $user = $this->auth->user();
             $user->last_activity = Carbon::now();
             $user->save();
        }
        return $next($request);
    }
}

В основном это было взято из этого ответа ( Проверить, находится ли пользователь в сети laravel ) в качестве стоп- решение пробела в проекте, над которым я работаю.

У меня есть столбец TIMESTAMP в моей таблице users, помеченный last_activity, и это глобальное промежуточное ПО моего файла ядра:

/**
 * The application's global HTTP middleware stack.
 *
 * These middleware are run during every request to your application.
 *
 * @var array
 */
protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \App\Http\Middleware\LastSeen::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\ModifyHeadersMiddleware::class,
];

Я не уверен, куда идти дальше, я только начинаю работать с промежуточным программным обеспечением и все еще учусь, но не уверен, что делаю неправильно...

Спасибо!


person jHannel    schedule 13.10.2018    source источник


Ответы (2)


Проблема в том, что информация об авторизованном пользователе хранится в сеансе, а проверка авторизации LastSeen выполняется до запуска сеанса, поэтому он всегда возвращает false.

Вам необходимо переместить промежуточное ПО LastSeen после промежуточного ПО StartSession:

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,

        \App\Http\Middleware\LastSeen::class,

        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];
person Andrew Zubets    schedule 13.10.2018

Есть некоторые проблемы, но главная ошибка заключается в том, что вы вызываете неправильный Auth. Вы должны вызвать фасад, вы вызываете фабрику Auth. Другое дело, избегайте конструктора. Будь проще. Особенно для MiddleWare. И последнее, вы обновляете статус пользователя, а не сохраняете новую запись.

namespace App\Http\Middleware;

use Closure;
use Carbon\Carbon;
use Auth;

class LastSeen
{
     /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
         if (Auth::check()) {
             $user = Auth::user();
             $user->last_activity = Carbon::now();
             $user->update();
        }
        return $next($request);
    }
}
person Dimitri Mostrey    schedule 13.10.2018