在Laravel 7的基本控制器中访问用户对象?

问题描述

我有一个基本控制器:

<?PHP

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\dispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
use Auth;

class Controller extends BaseController
{
  use AuthorizesRequests,dispatchesJobs,ValidatesRequests;

  public function __construct()
  {
    $user = Auth::user();
    if (!empty($user))
    {
      $uid = $user->id;
      DB::table("users")
        ->where("id",$uid)
        ->update(array(
          'last_time_page_accessed' => time(),));
    }
  }
}

问题是,即使我已经登录,它也不会到达$ uid = $ user-> id部分,因为$ user对象始终为空。

这是我从主控制器调用它的方式:

<?PHP

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Redirect;
use Auth;
use DB;
use App\Files;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Storage;

class ChatController extends Controller
{

  public function __construct()
  {
    parent::__construct();
    $this->middleware('auth');
  }

}

我想念什么?为什么它无法访问它?

更新

我尝试切换这些,但也没用:

  public function __construct()
  {
    $this->middleware('auth');
    parent::__construct();
  }

解决方法

如apokryfos所指出的那样,在构造控制器时,尚未通过身份验证的用户可用,因此auth()->user()将始终为null

您要尝试的是Middleware的完美用例。

您可以使用类似这样的东西。如果您希望此代码在每条路由上运行,则可以将您的中间件注册为每条Web路由的全局中间件。

<?php   

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class StoreLastTimeUserAccessedPage
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request,Closure $next,$guard = null)
    {
       if ($user = Auth::user()) {
           $user->update([
               'last_time_page_accessed' => time()
           ]);
       }

       return $next($request);
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...