在Laravel类中访问Auth()对象数据的问题

时间:2017-08-23 13:07:52

标签: php laravel frameworks

我看到了一些行为。通过Laravel类中的Auth门面访问用户数据时无法解释。这是我的代码的摘录:

private $data;
private $userID;//Set property

function __construct()
{
    $this->middleware('auth');//Call middleware
    $this->userID = Auth::id();//Define property as user ID
}

public function index() {
    return view('');
}

public function MyTestMethod() {

    echo $this->userID;//This returns null
    echo Auth::id();//This works & returns the current user ID

}

我已登录并在类中包含use Illuminate\Support\Facades\Auth;,因此代码可以正常工作,但只有在方法中访问Auth时才会生效 - 否则会返回null值。

最奇怪的是,我无法解决造成这种情况的原因。任何想法都一如既往地赞赏。提前谢谢!

2 个答案:

答案 0 :(得分:0)

在Laravel Laravel 5.3.4或更高版本中,您无法访问控制器构造函数中的会话或经过身份验证的用户,因为middlware尚未运行。

作为替代方案,您可以直接在控制器的构造函数中定义基于Closure的中间件。:

试试这个:

function __construct()
{    
    $this->middleware(function ($request, $next) {
       if (!auth()->check()) {
          return redirect('/login');
       }

       $this->userID = auth()->id(); // or auth()->user()->id

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

另一种替代解决方案是你的基本控制器类并添加__get函数,如下所示:

class Controller
{
    public function __get(string $name)
    {
        if($name === 'user'){
            return Auth::user();
        }

        return null;
    }
}

现在如果您当前的控制器可以像$this->user那样使用它:

class YourController extends Controller 
{
    public function MyTestMethod() {
        echo $this->user;
    }
}

答案 1 :(得分:0)

你应该试试这个:

function __construct() {
   $this->userID = Auth::user()?Auth::user()->id:null;
}

OR

public function __construct()
{
     $this->middleware(function ($request, $next) {
         $this->userID = Auth::user()->id;
         return $next($request);
     });
}