Laravel服务容器

Laravel官方文档其实更多的是教人如何使用,原理性的东西一概省略。这就让我们这些优秀的工程师很是摸不着头脑,每一步都要自己踩实了走,每一个问题都要自己探索。

几个注意的点:

  1. php的一个基础函数call_user_func_array,自己百度,看懂了再继续;
  2. php的回调函数(或匿名函数,闭包),自己百度,看懂了再继续;
  3. 没了;

不多说了,直接上代码。这十行代码看懂了,你将获益无穷。

class Container {//超级工厂,换个名字叫‘容器’
    private $binds = [];//保存我们的脚本

    //上面说的,接受脚本的函数
    public function bind ($key, $callback) {
        if ($callback instanceof Closure) {
            $this->binds[$key] = $callback;
        }
    }
    //真正执行脚本的函数
    public function make ($key, $component = []) {
        if (is_array($key)) {
            $instance = [];
            foreach ($key as $item) {
                $instance[] = call_user_func_array($this->binds[$item], [$this, $component]);
            }
            return $instance;
        }
        return call_user_func_array($this->binds[$key], [$this, $component]);
    }
}

超级工厂建好了,哒哒哒.....开始生产汽车!和上面结合着看

//这个必须的
$container = new Container();

//程序启动后,分别绑定轮子,发动机,座椅,‘宋’标识等等脚本到容器中,告诉容器如何制造这些东西。简称服务注册。
$container->bind('Wheel', function () {
    return new Wheel;
});
$container->bind('Engine', function () {
    return new Engine;
});
$container->bind('Seat', function () {
    return new Seat;
});
$container->bind('Sign_song', function () {
    return new Sign_song;
});

//诶,这个是制造汽车的脚本。
//有一次递归,有点绕,但很关键,仔细看!!!
$container->bind('Car', function ($container, $component) {
    return new Car($container->make($component));
});

//生产一台‘宋’字标的汽车
$myJiaKeChong = $container->make('Car', ['Wheel','Engine','Seat','Sign_song'...]);

上面代码的Container,和bind的地方,其实都不会出现在你的业务代码里。你一般只需要写最后那一行,生产汽车的那一行(当然车也是老王的),就可以了。Laravel中,绑定bind这件事儿一般都在 app/Providers 目录下做。当然,你也可以在 bootstrap/app.php 文件中看到几个关键服务的绑定过程。

Laravel的容器当然比我上面的半吊子容器牛逼多了,你可以在 ~/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php 中,看到这个承载了Laravel一切的神秘容器。里面同样有bind和make方法,意义和用法同我的容器也是一样的。



作者:稳健补刀的少年
链接:https://www.jianshu.com/p/f240f549bf40
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值