Laravel 5.5:如何定义可在所有控制器中使用的全局变量?

Posted

技术标签:

【中文标题】Laravel 5.5:如何定义可在所有控制器中使用的全局变量?【英文标题】:Laravel 5.5 : How to define global variable that can be used in all controllers ? 【发布时间】:2018-08-11 10:32:10 【问题描述】:

你好开发人员和编码员,

我的问题是如何定义一个全局变量,它可以用于 Laravel 中的所有控制器?

我在 AppServiceProviders 的启动方法中定义了一个变量$company - 我在所有刀片视图中都使用它,但我不能在控制器文件中使用它,它给出了错误,undefined variable $company p>

class AppServiceProvider extends ServiceProvider

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    
        View::share('key', 'value');
        Schema::defaultStringLength(191);

        $company=DB::table('company')->where('id',1)->first();
        View::share('company',$company);  

    

     /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    
        //
    


请指导我,感谢您的努力和时间:)

【问题讨论】:

如果它是静态的,您可以使用您创建的 .env 文件或配置文件。但如果它是动态变量,您可以使用会话或缓存在任何地方使用它。 @ErkanÖzkök,正如您在帖子中看到的,我正在使用查询生成器从数据库中获取记录,该变量是动态的而不是静态的。 我们为什么要使用 AppServiceProvider(@ErkanÖzkök 回答)?我可以使用任何其他服务提供吗?? 【参考方案1】:

在运行时设置配置变量

class AppServiceProvider extends ServiceProvider

    /**
    * Bootstrap any application services.
    *
    * @return void
    */
    public function boot()
    
        View::share('key', 'value');
        Schema::defaultStringLength(191);

        $company=DB::table('company')->where('id',1)->first();
        // View::share('company',$company);  
        config(['yourconfig.company' => $company]);
    

用法:

config('yourconfig.company');

【讨论】:

但是如果数据库还不存在怎么办?【参考方案2】:

好的,所以除非你想把它保存在你的会话中,我绝对不推荐,缓存似乎也不是一个最好的主意,或者通过框架内的配置系统设置它(已经是 3适用于不同问题的不同解决方案)我会从思考该变量将包含什么开始,如果这只是公司模型的集合,那么您基本上可以通过使用 Laravel Eloquent 方法在任何控制器中使用它。

我推荐的是$company = Company::where('foo', 'bar')->first();,或者只是一些数据提供者,它会以 Laravel 集合的形式返回你需要的所有信息。

tl;博士

#recommended way that's reusable throughout whole app
Company::find(1); // instead of DB::table('company')->where('id', 1)->get();

希望对您有所帮助。

【讨论】:

Company::find(1);DB::table('company')->where('id', 1)->get(); 。两者都是一样的,一个是雄辩的,一个是查询构建方式,可以使用任何方式,但我想要一个跨所有控制器的全局变量 我不确定使用全局变量是否是特别好的做法,并且 config 应该用于配置变量(因此名称)因此我仍然认为除非你想将这种数据保留在里面对于 Redis,我提出的解决方案是给定问题的最佳解决方案。

以上是关于Laravel 5.5:如何定义可在所有控制器中使用的全局变量?的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5.5 《电商实战 》辅助函数

如何在 laravel 查询生成器中使隐藏属性可见?

如何在 Laravel 5.8 中使 chart.js 动画/增长/活着?

Laravel 5.5 FormRequest 自定义错误消息

通过控制器助手授权:方法 authorize() 不存在 - Laravel 5.5

如何使用 Laravel 5.5 在控制器中使用两个参数进行重定向