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)
    {
        //
    }
}

当事件监听器被解析时,服务容器会读取类的构造函数上的类型提示,并注入对应的值


对于服务容器会读取类的构造函数上的类型提示,并注入对应的值这句话不是很理解

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

Laravel 是使用 phpReflectionClass 反射类实现的 file

它会获取你的构造函数的参数,那么他就知道 Illuminate\Contracts\Redis\Database 这个就是你的 Database 类型了。然后这里会根据 bind 之类的函数绑定契约与实体直接的关系,所以知道契约后,那么就能自动帮你创建注入进去了。

6年前 评论
讨论数量: 4

你要先学习容器、服务提供者的概念,就理解这段话了

6年前 评论

依赖注入是通过反射(reflection)实现的

6年前 评论

Laravel 是使用 phpReflectionClass 反射类实现的 file

它会获取你的构造函数的参数,那么他就知道 Illuminate\Contracts\Redis\Database 这个就是你的 Database 类型了。然后这里会根据 bind 之类的函数绑定契约与实体直接的关系,所以知道契约后,那么就能自动帮你创建注入进去了。

6年前 评论

可以这么理解:

$data['cache'] => FileCache::class; //文件缓存

我不想要文件缓存,

更换契约 $data['cache'] => RedisCache::class; //redis缓存

使用时, new $data['cache'];

契约,就是一个绑定

控制器注入的时候,他会解析$data['cache']绑定是谁

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!