Service Container
前言
上一节,我们对标签的选择方面做了一些优化,使得标签的选择更加合理。这节我们来看看 service container 。
说明
开发环境:Windows 7
Laravel 版本: 5+
IDE: Phpstorm
第25节了,我们讲了很多东西,但是还没涉及过 service container ,下面我们讲一下这个到底是什么。
Service Container
所谓的 Service Container 是一个管理类依赖或者说依赖注入的一个管理器。什么是“依赖注入”,先说“依赖”,一提“依赖”,那必须参与者大于等于2才能形成“依赖”关系,对于类也一样,一个类可能会用到另一个类,也就是产生了依赖的情况;“注入”是什么鬼,英文是“injected”,或者你知道“注射”,在医院,你得了什么病,需要什么要,给你打什么针,输什么液,都要看你具体的病情病症,然后再给你“注入”这些药物。那么合起来“依赖注入”,就是说什么时候需要这个“依赖”关系,什么时候“注入”。
具体在编程中,依赖注入的方式是通过构造函数传参或者 setter 方法来实现。
打开 routes.php ,这里放着我们所有的路由。在文件中添加一个路由:
Route::get('bar',function(Bar $bar){ dd($bar);});
有点编程经验的同学都知道,这个路由是找不到 bar 类的,因为我们压根就没定义过这个类,运行的话肯定会报错。(就不用试验了吧,你可以自己试验。)
但是我们在这个路由上面再添加一个 bar 类,情况就不一样了:
class Bar{}
我的网页上打印的是 “bar {#143}” ,应该是 $bar 的地址之类的。
但是你有没有发现,我们并没有显式的给那个闭包方法提供一个 bar 类的实例化对象,例如如下:
$bar = new Bar();
之类的语句,但是 Laravel 能找到那个类。
这就是 Service Container 的功能所在,它会通过 php 的一个核心机制“反射”来递归查找该类,然后,Service Container 会自动绑定(binding)该类。
那么有自动就有手动,如果想手动绑定(binding)的话,也可以:
App::bind('Bar',function(){ return new Bar();});
添加了上面的代码之后,你就已经通过 App 类的静态方法 bind() 绑定了那个类。还是一开始那句话,你即使不绑定,Laravel 会帮你绑定。
绑定接口
当你谢了一个接口需要实现的时候,这时候,可以通过绑定来把接口绑定到要实现该接口的类上。比如说:
interface BarInterface{}class Bar implements BarInterface{}Route::get('bar',function(BarInterface $bar){ dd($bar);});
此时你怎么能让 Service Container 知道你的类 Bar 实现 BarInterface 呢?看下面:
interface BarInterface{}class Bar implements BarInterface{}App:bind('BarInterface','Bar');Route::get('bar',function(BarInterface $bar){ dd($bar);});
或者:
interface BarInterface{}class Bar implements BarInterface{}App:bind('BarInterface','Bar');Route::get('bar',function(){ $bar = App::make(['BarInterface']); dd($bar);});
就这么简单。
回到当初
当初我们在学习 Laravel 的路由的时候,不知道你还有无印象,为什么教程里面教的是:
Route::get('/home', 'HomeController@index');
而最开始的 routes.php 里面却是这样的式儿的:
Route::get('/', function () { return view('welcome'); });
其实他们的功能都一样,只不过为了体现 MVC 的理念,各司其职,写到各自的类中,显得整齐。
总结
今天的内容其实就是想告诉我们 Laravel 的 Service Container 这个容器,它的用途和功能。它基于反射机制进行递归查找类,你可以手动,也可以自动,根据自己的需求来。更多的内容可以参考官方文档: Service Container。

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

SublimeText3 Linux新版
SublimeText3 Linux最新版

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

Atom编辑器mac版下载
最流行的的开源编辑器

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),