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 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

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

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

3年前 评论
讨论数量: 4

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

3年前 评论

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

3年前 评论

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

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

3年前 评论

可以这么理解:

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

我不想要文件缓存,

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

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

契约,就是一个绑定

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

3年前 评论

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