【问题标题】:Laravel 5: Global Auth $user variable in all controllersLaravel 5:所有控制器中的全局 Auth $user 变量
【发布时间】:2015-12-27 07:28:45
【问题描述】:

在我的 BaseController 我有这个:

public function __construct()
{
    $user = Auth::user();
    View::share('user', $user);
}

我可以在所有视图中访问 $user 数组,但如果我希望它成为所有控制器中可用的全局变量怎么办?

我有以下工作代码:

use Auth;
use DB;

class UsersController extends BaseController
{
   public function index()
   {
        $user = Auth::user();
        $users = DB::table('users')->where('user_id', $user->user_id)->get();
        return view('pages.users.index', compact('users');
    }
}

我希望 $user 变量在我的所有控制器以及每个控制器上的所有公共函数中都可用,但我不想重新声明“使用 Auth;”和“$user = Auth::user();”

我尝试将它添加到 BaseController 中的 __construct 中,但这似乎不起作用,未定义的 $user 变量错误。有什么想法吗?我知道这是可能的。

【问题讨论】:

标签: php laravel global-variables


【解决方案1】:

我不明白为什么这样的事情不起作用:

public function __construct()
{
    $this->user = \Auth::user();
    \View::share('user', $this->user);
}

这样,您的所有视图都可以使用它,并且只要您的控制器扩展 BaseController,它就可以在您的所有控制器中使用,$this->user。

【讨论】:

  • 在Controller的构造函数被调用的时候session还没有初始化,所以Auth::user() == null.
【解决方案2】:

我看不出使用Auth::user() 有什么问题,这个类使用单例模式,这意味着如果Auth::user() 已经初始化,它将不会再次检查数据库,尤其是当大部分代码应该'甚至不在控制器内部,所以基本上你仍然需要在你的服务、模型、表单请求等内部执行Auth::user()。

abstract class Controller extends BaseController {
    protected $user;
    use ValidatesRequests;
    public  function ___construct(){
        $this->user = \Auth::user();
    } 
}

【讨论】:

    【解决方案3】:

    为什么不使用辅助函数。它不会为您提供 $user 变量,但可以为您提供更简洁的方式来完成此操作。

    在你的 helpers.php 添加一个函数:

    function getUser(){
        return Auth::user();
    }
    

    在所有其他地方(控制器、视图、模型)调用:getUser()。就是这样。

    如果您的函数还没有任何帮助文件。你可以关注这个link来创建一个。

    【讨论】:

      【解决方案4】:

      已在其他答案中显示,您可以:

      • 将其设置为基本控制器的属性(我不推荐这样做,它只会增加混乱)
      • 创建自定义帮助程序(见下文)
      • 就做\Auth::user()


      另一种技巧,可以使用auth()helper:

      auth()->user()
      

      甚至是documented。


      根据this PR 的说法,没有计划在 Laravel 中添加 user() 助手。

      如果您认为值得将此帮助程序添加到您的项目中,代码如下:

      function user()
      {
          // short and sweet
          return auth()->user();
      
          // alternative, saves one function call!!
          return app('Illuminate\Contracts\Auth\Guard')->user();
      }
      

      【讨论】:

        猜你喜欢
        • 2014-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-08
        • 2014-10-01
        • 1970-01-01
        相关资源
        最近更新 更多