Laravel全局变量设置问题咨询:配置文件方式未达预期
解决Laravel中关联当前用户的全局变量设置问题
你的问题核心出在配置文件的加载时机上:Laravel的配置文件是在应用启动初期就加载完成的,这时候用户还没走完登录流程,Auth::user()根本拿不到当前登录用户的实例,所以你在constants.php里定义的companyID其实是null,自然后续的查询无法正常工作。
下面给你几个针对不同场景的可行方案:
方案一:模型全局作用域(最适配你的查询需求)
既然你需要在User模型中筛选当前用户公司的所有用户,用全局作用域是最优雅的方式——它会自动给所有User查询添加公司筛选条件:
在app/Models/User.php中添加全局作用域:
protected static function boot() { parent::boot(); // 添加公司筛选的全局作用域 static::addGlobalScope('company', function ($query) { // 先判断用户是否已登录,避免未登录场景下报错 if (auth()->check()) { $query->where('company', auth()->user()->company); } }); }
之后你直接调用User::get()就会自动返回当前用户公司的所有用户,不需要再单独写TEST()方法。如果某一次查询不需要这个筛选条件,可以临时移除作用域:
// 不应用公司筛选的查询 $allUsers = User::withoutGlobalScope('company')->get();
方案二:自定义辅助函数(通用场景)
如果需要在模型、控制器、视图等多个地方获取当前用户的公司ID,可以写一个全局辅助函数:
- 在
app目录下创建Helpers文件夹,新建custom_helpers.php文件:
<?php if (!function_exists('current_user_company')) { /** * 获取当前登录用户的公司标识 * @return string|null */ function current_user_company() { return auth()->check() ? auth()->user()->company : null; } }
- 修改
composer.json,让Laravel自动加载这个辅助文件:
在autoload节点下添加files数组:
"autoload": { "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" }, "files": [ "app/Helpers/custom_helpers.php" ] }
- 运行命令让Composer重新生成自动加载文件:
composer dump-autoload
之后你就可以在模型里这样使用:
public static function TEST() { return self::where('company', current_user_company())->get(); }
方案三:视图共享变量(仅用于视图场景)
如果你的全局变量是要传递给所有视图使用,可以在服务提供者中实现视图共享:
打开app/Providers/AppServiceProvider.php,在boot方法中添加:
public function boot() { // 给所有视图共享当前用户的公司信息 view()->share('currentCompany', auth()->check() ? auth()->user()->company : null); }
之后所有视图模板里都可以直接使用$currentCompany变量。
内容的提问来源于stack exchange,提问作者Muhammad Kazim
相关产品推荐
相关产品推荐

