Как сделать класс доступным глобально в приложении Laravel? - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь создать глобального помощника для хранения настроек сайта в моем приложении 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 ]

1 голос
/ 14 июня 2019

Вы должны зарегистрировать свой класс как синглтон в контейнере приложения , прежде чем сможете его использовать.В противном случае функция app() будет создавать новый экземпляр при каждом использовании.Вы также можете дать экземпляру имя в контейнере, таким образом, вам не нужно создавать собственную глобальную функцию.

В вашем AppServiceProvider.php:

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

А теперьВы можете использовать свой класс с:

app('settings')->put('test', 'test2');
dd(app('settings')->all());
0 голосов
/ 14 июня 2019

Сделать синглтон в провайдере, пример 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
});

Везде в вашем приложении может быть только 1 помощник по настройке, и вы можете получить его вот так.

use App\Helpers\SettingsHelper;

app(SettingsHelper::class);
0 голосов
/ 14 июня 2019

Создать поставщика услуг php artisan make:provider HelperServiceProvider

Затем в методе регистрации сделать что-то вроде:

public function register()
{
    foreach (glob(app_path().'/Helpers/*.php') as $filename) {
        require_once($filename);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...