如何使一个类在Laravel应用程序中全局访问?

时间:2019-06-14 08:05:53

标签: php laravel

我正在尝试创建一个全局帮助器,以将站点设置存储在我的Laravel应用程序中。意思是,我需要一个助手来从控制器设置设置,并使用同一助手从任何地方访问该设置对象。我不需要将这些设置存储在数据库或文件中。这就是为什么我需要这些功能。

所做的如下,

  • app/Helpers目录中创建一个名为SettingsHelper的类,并自动加载该目录。
namespace App\Helpers;

class SettingsHelper{

    protected $vars;

    public function all(){
        return $this->vars;
    }

    public function get($key, $default = null){

        if (is_array($this->vars) && array_key_exists($key, $this->vars)) {
            return $this->vars[$key];
        }

        return $default;
    }

    public function put($key, $value){
        return $this->vars[$key] =$value;
    }

}
  • 创建一个辅助函数来解析该类(如果尚未解析的话)
if ( ! function_exists('settings')) {

    function settings(){

        if (app('\App\Helpers\SettingsHelper')) {
            return app('\App\Helpers\SettingsHelper');
        }

        return app()->make('\App\Helpers\SettingsHelper');
    }

}
  • 使用助手设置并获取设置
settings()->put('test', 'test2');
dd(settings()->all());

但是返回null。我尝试转储settings()->put('test', 'test2'),它返回了传递的值test2

这是正确的方法吗?

3 个答案:

答案 0 :(得分:1)

您应该先register your class as a singleton in the application container使用它。否则,app()函数将在每次使用时创建一个新实例。您还可以在容器中为实例命名,这样就不必创建自己的全局函数。

在您的AppServiceProvider.php中:

$this->app->singleton('settings', function ($app) {
    return new \App\Helpers\SettingsHelper;
});

现在您可以在以下课程中使用您的课程:

app('settings')->put('test', 'test2');
dd(app('settings')->all());

答案 1 :(得分:0)

创建服务提供商php artisan make:provider HelperServiceProvider

然后在register方法中执行以下操作:

public function register()
{
    foreach (glob(app_path().'/Helpers/*.php') as $filename) {
        require_once($filename);
    }
}

答案 2 :(得分:0)

在提供者中创建单例,例如AppServiceProvider.php

use App\Helpers\SettingsHelper;

$this->app->singleton(SettingsHelper::class, function ($app) {
    return new SettingsHelper($vars); // create your class with the vars you need
});

应用程序中的每个地方只有一个设置助手,您可以像这样获得它。

use App\Helpers\SettingsHelper;

app(SettingsHelper::class);