php - 如何在 Laravel 应用程序中使类可全局访问?

标签 php laravel

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

所做的事情如下,

  • 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

这是正确的方法吗?

最佳答案

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

在您的AppServiceProvider.php中:

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

现在您可以将您的类(class)用于:

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

关于php - 如何在 Laravel 应用程序中使类可全局访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56593999/

相关文章:

php - php 数据未正确插入数据库

php - 在 php 中获取文件 mime 类型的最佳方法

php - Laravel 错误无法添加外键约束

php - 使用 Laravel 队列发送批量电子邮件

php - ppa :ondrej/nginx? 的目的是什么

php - 按文件名对 $_FILES 进行排序

php - 使用 PDO 获取单个返回值

php - Laravel 急切加载并加入其他表

php - 来自另一个表的 Laravel 5 where 子句

javascript - 错误 64 SSL 证书 laravel