laravel的orm特別好用,特別是observer觀察者模式,可以在不更改原有業(yè)務(wù)代碼的情況下做到切入編程,有點(diǎn)類似于我們之前常用的鉤子函數(shù)。
下面就是我們深入observer觀察者模式的實(shí)戰(zhàn)代碼
現(xiàn)有一個(gè)業(yè)務(wù)邏輯是姚淆,我們的會(huì)員系統(tǒng)有一個(gè)經(jīng)驗(yàn)值,當(dāng)某個(gè)經(jīng)驗(yàn)值達(dá)到某個(gè)臨界點(diǎn)的時(shí)候我們就給這個(gè)會(huì)員升級(jí)權(quán)限屡律。
但是獲取這個(gè)經(jīng)驗(yàn)值的渠道有很多腌逢,意思就是我們的獲取經(jīng)驗(yàn)值的代碼可能存在多個(gè)地方,如果要去改動(dòng)代碼的話需要找到每個(gè)代碼文件一一的更改代碼超埋。
有沒(méi)有一種在不改動(dòng)之前的業(yè)務(wù)代碼下的只需要增加一個(gè)判斷就能做到經(jīng)驗(yàn)值達(dá)到>升級(jí)這步操作呢搏讶?
當(dāng)然有,就是laravel的observer觀察者模式纳本。
看看實(shí)戰(zhàn)代碼
<?php
namespace App\Observers\Member;
use App\Model\Member\MemberModel;
class MemberObserver
{
public function saving(MemberModel $model)
{
//如果面經(jīng)值大于1000 或者mvp大于10 并且是普通會(huì)員
if (($model->exp_interview >= 1000 || $model->exp_mvp >= 10) and $model->role_interview == 0) {
$model->role_interview = 1;
}
if (isset($model['exp_interview']) and isset($model['exp_shen'])) {
$model['exp_interview'] = $model['exp_interview'] >= 0 ? $model['exp_interview'] : 0;
$model['exp_shen'] = $model['exp_shen'] >= 0 ? $model['exp_shen'] : 0;
}
return $model;
}
public function created(MemberModel $model)
{
//新用戶注冊(cè)
if ($model->pid !== 0) {
$member = MemberModel::query()->select('id', 'name')->find($model->pid);
if (isset($member)) {
$count = MemberModel::query()->where('pid', $model->pid)->count();
$member->sub_count = $count;
$member->save();
}
}
}
}
這里我們新建了一個(gè)MemberObserver類窍蓝,主要就是我們的業(yè)務(wù)邏輯
方法saving就是當(dāng)MemberModel 就是我們的會(huì)員表發(fā)生正在保存中的事件時(shí),當(dāng)經(jīng)驗(yàn)值大于多少繁成,就把我們的權(quán)限升級(jí)為某個(gè)等級(jí)吓笙。
方法created意思為當(dāng)MemberModel模型發(fā)生insert插入成功后觸發(fā)的事件,插入成功肯定就是我們的會(huì)員注冊(cè)成功了巾腕,給邀請(qǐng)人發(fā)放獎(jiǎng)勵(lì)之類的邏輯就可以寫(xiě)在這里面睛。
現(xiàn)在我們的觀察者定義好了,就要讓我們的觀察者正常工作尊搬。
來(lái)到\app\Providers目錄下找到AppServiceProvider.php文件
在boot方法中注冊(cè)一下我們的MemberObserver
public function boot()
{
MemberModel::observe(MemberObserver::class);
}
至此我們的觀察者就注冊(cè)好了叁鉴,這里的意思就是讓MemberObserver去觀察MemberModel模型
觀察者中還可以定義其他的一些事件,這些都是laravel為我們定義好了的
retrieved
creating
created
updating
updated
saving
saved
deleting
deleted
restoring
restored
具體的事件類型可以去查詢一下laravel的官方文檔
再讓我們看看為什么我們能監(jiān)聽(tīng)到模型的事件佛寿,查看一下laravel的源代碼
找到模型基類 \vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php
以save方法為例
/**
* Save the model to the database.
*
* @param array $options
* @return bool
*/
public function save(array $options = [])
{
$query = $this->newModelQuery();
// If the "saving" event returns false we'll bail out of the save and return
// false, indicating that the save failed. This provides a chance for any
// listeners to cancel save operations if validations fail or whatever.
if ($this->fireModelEvent('saving') === false) {
return false;
}
// If the model already exists in the database we can just update our record
// that is already in this database using the current IDs in this "where"
// clause to only update this model. Otherwise, we'll just insert them.
if ($this->exists) {
$saved = $this->isDirty() ?
$this->performUpdate($query) : true;
}
// If the model is brand new, we'll insert it into our database and set the
// ID attribute on the model to the value of the newly inserted row's ID
// which is typically an auto-increment value managed by the database.
else {
$saved = $this->performInsert($query);
if (! $this->getConnectionName() &&
$connection = $query->getConnection()) {
$this->setConnection($connection->getName());
}
}
// If the model is successfully saved, we need to do a few more things once
// that is done. We will call the "saved" method here to run any actions
// we need to happen after a model gets successfully saved right here.
if ($saved) {
$this->finishSave($options);
}
return $saved;
}
在save方法中我們看到有一個(gè)
if ($this->fireModelEvent('saving') === false) {
return false;
}
這里就是去觸發(fā)我們的saving方法幌墓,
不得不感嘆laravel的orm真的是非常的好用,確實(shí)加入了很多現(xiàn)代編程的規(guī)范和一些奇思妙想的方法冀泻。常侣。
版權(quán)聲明:本文由何煩過(guò)虎溪發(fā)布,如需轉(zhuǎn)載請(qǐng)注明出處弹渔。
轉(zhuǎn)載請(qǐng)注明出處:http://www.95shouyou.com/?id=27