Laravel底层学习笔记04 加载并启动ServiceProvider,事件(观察者模式)

参考资料:
Laravel Service Provider 中 boot 方法和 register 方法的区别
php artisan 命令
new self 和new static

new self() 返回的是self所在类
new static() 返回调用者所在类
class Father{ public function getSelf(){ return new self(); } public function getStatic(){ return new static(); } } $f = new Father(); echo get_class($f->getSelf()); //Father echo get_class($f->getStatic()); //Father class Son extends Father{ } $s = new Son(); echo get_class($s->getSelf()); //Father echo get_class($s->getStatic()); //Son

加载并启动ServiceProvider boot和register方法的区别
register方法是必须的,boot方法不是
register 方法用于绑定服务到容器,框架会先调用所有 provider 的 register 方法,等所有服务都注册完毕再去调用每一个服务的 boot 方法。所以不能在 register 方法里面调用其他 provider 提供的服务,因为我们无法保证其他服务已经注册完毕。而在 boot 方法里面你可以干任何事情!

dispatch和延迟加载 延迟加载
开启延迟加载
vim FamilyServiceProvider.php
$defer = true; public function providers(){ return ['Family']; }

除编译生成的文件(optimize的反向操作)
php artisan clear-compiled

调用
app('Family')->test(); //没有providers()时的调用方法 app('App\Service\Family\FamilyService')->test(); //providers()方法等价于 app('app')->bind('Family','App\Service\Family\FamilyService');

源码
vim Illuminate/Foundation/Application.php
public function make($abstract, array $parameters = []) { $abstract = $this->getAlias($abstract); if (isset($this->deferredServices[$abstract]) && ! isset($this->instances[$abstract])) { $this->loadDeferredProvider($abstract); } }

事件和监听者
观察者模式
观察者模式能够便利的创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定性功能。
为软件添加由某个动作或状态变化激活的,但是松散耦合的新功能时,应当创建基于观察者模式的对象。
模拟创建订单时发送短信邮件 非观察者模式
class order{ public function add(){ $a = new Message(); $a->send(); $b = new Email(); $b->send(); } } class Message{ public function send(){ echo '发送短信'; } } class Email{ public function send(){ echo '发送邮件'; } } $order = new Order(); $order->add(); //发送短信发送邮件

观察者模式
instance) === false){ $this->instance[] = $observe; } } public function del(Observe $observe){ if($key = array_search($observe, $this->instance) !== false){ unset($this->instance[$key]); } } public function notify(){ foreach ($this->instance as $observe){ $observe->send(); } } } //观察者 interface Observe{ function send(); } class Message implements Observe{ public function send(){ echo '发送短信'; } } class Email implements Observe{ public function send(){ echo '发送邮件'; } } $order = new Order(); $order->add(new Message()); $order->add(new Email()); $order->notify(); //发送短信发送邮件

如果再想发送钉钉提醒,则只需要实现Observe接口类即可
class DingTalk implements Observe{ public function send(){ echo '发送钉钉提醒'; } } $order = new Order(); $order->add(new DingTalk()); $order->notify(); //发送钉钉提醒

创建事件和监听者 创建事件和监听者
php artisan make:event EventTest php artisan make:listener EventTestListener php artisan make:listener OtherListener

注册事件和监听者
vim app/Providers/EventServiceProvider.php
'App\Events\EventTest' => [ 'App\Listeners\EventListener', 'App\Listeners\OtherListener', ],

【Laravel底层学习笔记04 加载并启动ServiceProvider,事件(观察者模式)】调用事件
event(new EventTest());

    推荐阅读