关于laravel:Laravel底层学习笔记04-加载并启动ServiceProvider事件观察者模式

35次阅读

共计 2731 个字符,预计需要花费 7 分钟才能阅读完成。

参考资料:
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();// 发送短信发送邮件 
观察者模式
<?php
// 被观察者接口
interface Observable{function add(Observe $observe);// 新增观察者
    function del(Observe $observe);// 删除观察者
}
class order implements Observable{private $instance = array();
    public function add(Observe $observe){if(array_search($observe, $this->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',
],

调用事件

event(new EventTest());

正文完
 0