laravel 5.4:无法访问__construct方法

时间:2017-07-12 10:51:23

标签: php laravel laravel-5.4

在Laravel的早期版本中,在我需要使用以下所有方法访问登录用户的控制器中:

class DashboardController extends Controller
{
    private $user ;
    function __construct(Request $request)
    {
        $this->middleware('auth');
        $this->user = \Auth::user();
    }

    function func_1(){
      $objects = Objects::where('user_id' , $this->user->id )->get();
    }
    function func_2(){
      $objects = Objects::where('user_id' , $this->user->id )->get();
    }
    function func_3(){
      $objects = Objects::where('user_id' , $this->user->id )->get();
    }

主要是因为我不喜欢默认语法\Auth::user(),但在升级到5.4之后,这不再起作用了,我从null获得$this->user

但它在其他方法中工作正常。基本上\Auth::user()会在null方法中返回__construct,但在其他函数中可以正常工作。

2 个答案:

答案 0 :(得分:14)

正如doc所说:

  

在早期版本的Laravel中,您可以访问会话变量或   控制器构造函数中经过身份验证的用户。这是   从来没有打算成为框架的明确特征。在Laravel   5.3,您无法访问控制器构造函数中的会话或经过身份验证的用户,因为中间件尚未运行。

所以试试这个:

public function __construct()
{
    $this->middleware('auth');
    $this->middleware(function ($request, $next) {
        $this->user = Auth::user();

        return $next($request);
    });
}

答案 1 :(得分:0)

您必须在使用命名空间加载类之前定义Auth方法。请参阅下面的示例:

namespace App\Http\Controllers\Admin;

use Illuminate\Support\Facades\Input;
use Auth;

class DashboardController extends Controller
{
    private $user ;
    function __construct(Request $request)
    {
        $this->middleware('auth');
        $this->user = Auth::user();
    }

    function func_1(){
      $objects = Objects::where('user_id' , $this->user->id )->get();
    }
    function func_2(){
      $objects = Objects::where('user_id' , $this->user->id )->get();
    }
    function func_3(){
      $objects = Objects::where('user_id' , $this->user->id )->get();
    }

如果需要,可以清理缓存。 php artisan config:cache