Laravel官方文档其实更多的是教人如何使用,原理性的东西一概省略。这就让我们这些优秀的工程师很是摸不着头脑,每一步都要自己踩实了走,每一个问题都要自己探索。
几个注意的点:
- php的一个基础函数call_user_func_array,自己百度,看懂了再继续;
- php的回调函数(或匿名函数,闭包),自己百度,看懂了再继续;
- 没了;
不多说了,直接上代码。这十行代码看懂了,你将获益无穷。
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
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。