我正在尝试创建一个全局帮助器,以将站点设置存储在我的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
。
这是正确的方法吗?
答案 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);