Laravel 5:如何通过构造函数添加Auth :: user() - > id?

时间:2015-06-22 21:59:20

标签: authentication laravel constructor

我可以像这样获得经过身份验证的用户的ID:

Auth::user()->id = $id;

很好用,但是我有很多需要它的方法,我想要一个更简洁的方法将它添加到整个类中,所以我可以在每个方法中引用$ id。我正在考虑将它放入构造函数中,但由于Auth :: user是静态的,我正在制作一堆东西并且不知道如何去做。

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

您可以为身份验证类注入合同,然后在控制器上设置用户ID,而不是使用Facade。就像@rotvulpix所示,您可以将它放在您的基本控制器上,以便所有子控制器也可以访问用户ID。

<?php

namespace App\Http\Controllers;

use Illuminate\Contracts\Auth\Guard;

class FooController extends Controller
{
    /**
     * The authenticated user ID.
     *
     * @var int
     */
    protected $userId;

    /**
     * Construct the controller.
     *
     * @param  \Illuminate\Contracts\Auth\Guard  $auth
     * @return void
     */
    public function __construct(Guard $auth)
    {
        $this->userId = $auth->id();
    }
}

后卫有一个id()方法,如果没有用户登录则会返回void,这比通过user()->id要容易一些。

答案 1 :(得分:2)

Laravel&gt; = 5.3

您无法访问控制器构造函数中的会话或经过身份验证的用户,因为中间件尚未运行。

作为替代方案,您可以直接在控制器的构造函数中定义基于Closure的中间件。在使用此功能之前,请确保您的应用程序正在运行Laravel 5.3.4或更高版本:

class UserController extends Controller {

    protected $userId;

    public function __construct() {

        $this->middleware(function (Request $request, $next) {
            if (!\Auth::check()) {
                return redirect('/login');
            }
            $this->userId = \Auth::id(); // you can access user id here

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

答案 2 :(得分:1)

您可以在整个应用程序中使用Auth :: user()。你在哪里并不重要。但是,在回答您的问题时,您可以使用&#39;控制器&#39;类存在于controllers文件夹中。在那里添加构造函数并引用用户ID。

<?php namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesCommands;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;

/* Don't forget to add the reference to Auth */
use Auth;

abstract class Controller extends BaseController {

    use DispatchesCommands, ValidatesRequests;

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

然后,在任何控制器的任何方法中,您都可以使用$ this-&gt; userID变量。