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());
推荐阅读
- 由浅入深理解AOP
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- 一起来学习C语言的字符串转换函数
- 定制一套英文学习方案
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 《深度倾听》第5天──「RIA学习力」便签输出第16期
- 如何更好的去学习
- 【韩语学习】(韩语随堂笔记整理)
- 焦点学习田源分享第267天《来访》