第一步,注册个观察者,监听数据变化
1.创建观察者:在Command LineTools Consol中创建观察者类,会自动生成在app/Observers下,Observer这个目录第一次创建观察者类时会被自动创建,在创建观察者时也可以指定它的模型类:–model;
php artisan make:observer --model=config ConfigObserver
但在这里我们不需要制定模型了,我们需要自定义观察者中的方法:
php artisan make:observer ConfigObserver
2。注册观察者:
注册观察者有两种方式:
第一种:我们在app/providers/AppServiceProvider.php里的boot方法中注册:
public function boot()
{
//注册观察者
Config::observe(ConfigObserver::class);
}
第二种:我们在config模型中自定义一个boot模型来注册观察者:
namespace App\Model;
public static function boot(){
Config::observe(ConfigObserver::class);
}
第二步,做数据缓存
在刚才创建的观察者类里,定义事件,在Eloquent: 入门中的事件中
namespace App\Observers;
class ConfigObserver
{
//ConfigObserver这个模型只要一监听到config这个模型中的updateOrCreate这个命令一运行之后就会触发created和saved 这两个方法,实现数据缓存,updateOrCreate的调用见下个代码块
public function created ( Config $config )
{
$this->cache ();
}
public function saved ( Config $config )
{
$this->cache ();
}
public function cache ()
{
//数据缓存,在缓存系统里可以找到,这里由于配置项的修改一般很少,所以做永久缓存,可以全局调用
//pluck 这个是 系统自带方法,表示查找数据库中键名叫name这个字段中键值是data的值,且只取一条数据,是一维数组
\Cache::forever ( 'hd_config' , Config::pluck ( 'data' , 'name' ) );
}
}
updateOrCreate的调用见下个代码块
public function update($name,Request $request){
//config这个模型执行数据操作时,会触发监听里的运行created和saved
Config::updateOrCreate(
['name'=>$name],//查找条件
['name'=>$name,'data'=>$request->all ()]//添加更新的数据
);。。。。。
第三步:定义一个函数来读取缓存,此方法定义在helper.php中,这样就可以用这个函数来读配置项的值,且全局可用
//$var实参,传入配置项的名称和数据中的某个字段,如:site.title表示配置项是site,,name叫title
function hd_config ( $var )
{
//定义静态变量,做缓存,
static $cache = [];
//拆分字段,得到site和title,
$info = explode ( '.' , $var );
//如果$cache中有值则跳过给$cache赋值直接读取$cache,否则要做赋值
if ( ! $cache ) {
//从缓存中读取数据,如果读取不到hd_config,那么将执行function回调
$cache = Cache::get ( 'hd_config' );
}
//把配置项所对名name的值返回出来,这中??的写法就同isset判断是否存在,不存在给个默认值
return $cache[ $info[ 0 ] ][ $info[ 1 ] ]??'';
}