Laravel 契约的疑问
阅读laravel5.5文档有关于契约介绍的时候看到这么一段话如下(虚线中的内容)
Laravel 中的许多类型的类都是通过 服务容器 解析出来的,包括控制器、事件监听器、中间件、任务队列,甚至路由闭包。所以说,要获得一个契约的实现,你只需要被解析的类的构造函数中添加「类型提示」即可。
例如,看看这个事件监听器:
<?php
namespace App\Listeners;
use App\User;
use App\Events\OrderWasPlaced;
use Illuminate\Contracts\Redis\Database;
class CacheOrderInformation
{
/**
* Redis 数据库实现。
*/
protected $redis;
/**
* 创建事件处理器实例。
*
* @param Database $redis
* @return void
*/
public function __construct(Database $redis)
{
$this->redis = $redis;
}
/**
* 处理事件。
*
* @param OrderWasPlaced $event
* @return void
*/
public function handle(OrderWasPlaced $event)
{
//
}
}
当事件监听器被解析时,服务容器会读取类的构造函数上的类型提示,并注入对应的值
对于服务容器会读取类的构造函数上的类型提示,并注入对应的值
这句话不是很理解
Laravel
是使用php
的ReflectionClass
反射类实现的它会获取你的构造函数的参数,那么他就知道
Illuminate\Contracts\Redis\Database
这个就是你的Database
类型了。然后这里会根据bind
之类的函数绑定契约与实体直接的关系,所以知道契约后,那么就能自动帮你创建注入进去了。