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

问题描述 投票:0回答:5

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

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

它很好用,...但是我有很多需要它的方法,我想要一种更干净的方法将它作为一个整体添加到类中,所以我可以在每个方法中引用 $id 。我正在考虑将其放入构造函数中,但由于 Auth::user 是静态的,我把事情搞得一团糟,不知道该怎么做。

非常感谢您的帮助!

authentication laravel constructor
5个回答
5
投票

Laravel >= 5.3

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

作为替代方案,您可以直接在控制器的构造函数中定义基于闭包的中间件。在使用此功能之前,请确保您的应用程序正在运行 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);
        });
    }
}

4
投票

您可以注入身份验证类的合约,然后在控制器上设置用户 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
更容易。


2
投票

您可以在整个应用程序中使用 Auth::user()。你在哪里并不重要。但是,为了回答您的问题,您可以使用控制器文件夹中存在的“控制器”类。在那里添加一个构造函数并引用用户 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->userID 变量。


0
投票

您可以通过在构造函数中创建中间件,在 Laravel 的官方文档中找到您的解决方案。因为,当控制器构造函数被调用时,中间件当时还没有运行。因此,您需要在构造函数中运行它。

以下是您问题的答案:https://stackoverflow.com/a/76637345/5640381


0
投票

以下代码中,您可以根据需要将“api”替换为“web”。

class DocumentController extends Controller{
    public $memberId;
    public function __construct(){
      $this->memberId = (Auth::guard('api')->user()->id ?? null);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.