#Laravel Container 初探(1/3)

Laravel Container 初探

laravel 服务容器一直是我没有理解的地方,但官方文档说服务容器是 laravel 的核心。我也是崩溃,所以只能一点点的理解,下面记下过程中的点滴。

Laravel 的服务容器是什么

官方文档写到 laravel 的服务容器是一个强大的依赖注入工具,但依然不明白具体含义。所以决定实验一下。

为什么要使用服务容器

Laravel 推荐使用服务容器(这个理由。。。哈哈😀)

怎么做,我们该怎么做

设计一个汽车类 Car,直接写到 routes 的 web.php 路由文件中(5.3版本),这样就能及时的看到我们调试的代码了。下面将先通过常规方法实例化 Car ,找到不足,进而理解为什么要使用服务容器来实例化 Car。

开始测试

环境 MacOS Sierra 10.12.1,Valet,PHPStorm 开发环境

以下代码直接写到 routes 路由中(laravel5.3 可以写到 routes/web.php 中)

可以直接用类实例化实现:当然这是最常用的也是最普通的方法,当 Car 实例化的之后

//汽车类
class Car {}

//常规调用
Route::get('/car', function () {
    //dd(new Car);
    //使用 new Car 不带 () 也一样可以实例化类
    dd(new Car());
});

下面在函数参数中传递 Car 实例变量

//用户类
class Car {}

/*这里很神奇吧,明明没有实例化 Car,为什么可以打印出对象?
 *当然这里是使用了服务容器依赖注入,laravel 官方说使用的 PHP ReflectionClass 反射功能
 */
Route::get('/car', function (Car $car) {
    dd($car);
});

以上两段代码产生的效果是一样的,在浏览器访问 /car 路由可以看到:

访问 user 路由 dd() 打印结果

使用服务容器

为了使用服务容器,我们来制作一个宝马车系的类吧

//汽车接口
interface Car {}

//Bmw 宝马X5
class BmwX5 implements Car {}

Route::get('/car', function (BmwX5 $car) {
    dd($car);
});

接着访问 /car 路由:

访问 /car 路由

OK!看起来依然可以正常运作。

我们来想一想,如果我们想换宝马 X6 系列,怎么办呢?这里我们一般要在实例化 BmwX6 implements Car 然后把路由中的类替换。

//汽车接口
interface Car {}

//Bmw 宝马X5
class BmwX5 implements Car {}

//Bmw 宝马X6
class BmwX6 implements Car {}

Route::get('/car', function (BmwX6 $car) {
    dd($car);
});
访问 /car 路由

绑定接口到实现

仔细想想,这样是不是太麻烦了?这里就自然引出主角 laravel 服务容器。
laravel 服务容器我感觉其实是类绑定到接口的抽象容器。

//汽车接口
interface Car {}

//Bmw 宝马X5
class BmwX5 implements Car {}

//注意这里和之前两段代码很大的不同之处在于这里 直接使用了接口类型作为 参数类型,其实这里是一个类型提示,但想想也不能被正常解析,毕竟仅仅只是契约接口,我们接着往下看:
Route::get('/car', function (Car $car) {
    dd($car);
});
BindingResolutionException

这是为什么,上面报错日志中提示说 服务容器绑定解析异常,目标 Car 类不能被实例化。 BindingResolutionException in Container.php line 763:
这在官方文档中也给出了合理的解释,官方文档中说,如果你的类没有实现任何接口的话,则不需要绑定服务容器。当然,我们这里是实现了接口的类,而且还使用了接口类型做参数提示,当然不行。

当前的 class BmwX5 implements Car 实现了 Car 接口,所以这里我们应该绑定到服务容器了。

//汽车接口
interface Car {}

//Bmw 宝马X5
class BmwX5 implements Car {}

//Bmw 宝马X6
class BmwX6 implements Car {}

//绑定接口到实现(服务容器一般在自己的 CustomProvider 中 Register() 方法中绑定,但这里为了方便说明问题就直接写在路由文件中了。)
App::bind('Car', function () {
    //当我们需要 Car 时,下面返回我们需要的 Car 实例,可以根据需求更换
    //return new BmwX5();
    return new BmwX6;
});

Route::get('/car', function (Car $car) {
    dd($car);
});
Bmw 宝马X6

先写到这里,后面几天继续

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • 原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts ...
    layjoy阅读 8,607评论 0 121
  • 先说几句废话,调和气氛。事情的起由来自客户需求频繁变更,伟大的师傅决定横刀立马的改革使用新的框架(created ...
    wsdadan阅读 3,053评论 0 12
  • 必备品文档:DocumentationAPI: API Reference视频:Laracasts速查表:Lara...
    ethanzhang阅读 5,746评论 0 68
  • 0.1配置1.模板继承2.控制器3.git4.支付宝支付的流程5.路由6.中间件7.请求8.laravel 学习笔...
    云龙789阅读 808评论 0 5