问题描述
<?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);
}
}