Laravel服务/服务提供者/容器/契约和门面
1.服务是什么?
服务是提供了一些功能的类,比如发送邮件,写日志.
2.Laravel服务提供者是什么?
服务提供者中指明了这个提供者可以提供哪些服务(注册服务),以及服务注册后默认调用一些方法(boot).
3.能否不用服务提供者,直接调用服务?
可以,依靠Laravel的依赖注入,你可以方便的调用任何一个服务,而不用服务提供者.
4.既然3成立,那么服务提供者有什么存在的必要?
a.利用服务提供者的boot方法,可以做一些全局性的设置,如在boot中对view的composer
b.服务提供者利用bind或singleton可以实现一个接口到实现类绑定,调用该服务对应的接口,会返回了一个具体的实现类.这不是更复杂了么?是的,是有点复杂,但好处是松耦合,更加灵活,调整服务也变的更加简单.
5.服务容器是什么?
服务容器是一个用于管理类依赖和执行依赖注入的强大工具.简而言之就是,你将功能类(服务)作为参数传递到一个容器类中,以后直接调用容器类就可以.服务提供者的绑定就是向Laravel核心容器类,传递了一个服务类来做参数,核心容器类内部实现了绑定该服务作为容器类的一个属性.
9.服务提供者在应用启动时,就会注册相应的服务,这会不会显得没有必要?因为有些情况下,不是应用开始就需要这个服务的.
是,所以你可以在服务提供者中延迟加载,只有在你需要的时候才加载这个服务.设置服务提供者的defer属性和provides方法.
10.服务提供者功能之一是实现了一个接口到实现类的绑定,能否根据具体情况,比如A控制器中调用服务接口实现接口的A实现类,B控制器中调用接口的B实现类?
可以,在服务提供者中绑定的时候实现依据上下文环境绑定.
如
$this->app->when('App\Handlers\Commands\CreateOrderHandler')
->needs('App\Contracts\EventPusher')
->give('App\Services\PubNubEventPusher');
11.有没有一个服务提供者聚合多个服务的结果,对外使用一个统一的名称来访问?
可以,使用服务提供者的标签
12.能从服务容器中解析出一个对象吗?
可以.
a.使用$this->app->make('xxx')或$this->app['xxx'],在控制器中使用帮助函数app()->make('XXX')
b.可以简单的通过在类的构造函数中对依赖进行类型提示来从容器中解析对象,包括控制器、事件监听器、队列任务、中间件等都是通过这种方式
public function __construct(UserRepository $users)
{
$this->users = $users;
}
13.能否在从容器中解析对象的时候触发一个事件?
可以,在服务提供者中使用$this->app->resolving
14.门面和契约是什么?
a.Laravel 的契约是指框架提供的一系列定义核心服务的接口,比如, Illuminate\Contracts\Queue\Queue 契约定义了队列任务需要的方法, Illuminate\Contracts\Mail\Mailer 契约定义了发送邮件所需要的方法.每一个契约都有框架提供的相应实现。比如,Laravel 提供了多个驱动的队列实现,邮件实现则由 SwiftMailer驱动。所有的 Laravel 契约都有其 GitHub 库,这为所有有效的契约提供了快速入门指南,同时也可以作为独立、解耦的包被包开发者使用。
b.Laravel 的门面为 Laravel 服务的使用提供了一个简便的方式——不再需要从服务容器中类型提示和解析契约.如Auth::user(),Auth::check();Cache::get()等
15.基本点
a.服务提供者在项目根目录下的Providers
b.可以使用命令创建一个服务提供者
php artisan make:provider TestProvider
c.每个服务提供者需要注册在在config/app.php的providers数组中
Laravel服务/服务提供者/容器/契约和门面的更多相关文章
- Laravel 服务容器、服务提供器、契约实例讲解
前言 刚开始看laravel服务容器.契约.服务提供器的确生涩难懂,不单单是概念繁多,而且实际的demo很难找(找是找到了,但难用啊),最后就隔一段时间看一遍,大概个十来遍,还真给看出个门道, ...
- laravel服务容器-----深入理解控制反转(IoC)和依赖注入(DI)
首先大家想一想什么是容器,字面意思就是盛放东西的东西,常见的变量,对象属性都是容器,一个容器能够装什么东西,完全在于你对这个容器的定义.有的容器不仅仅只是存文本,变量,而是对象,属性,那么我们通过这种 ...
- Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)
容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器.一个容器能够装什么,全部取决于你对该容器的定义.当然,有这样一种容器,它存放的不是文本.数值,而是对象.对象的描述(类.接口)或 ...
- Laravel中服务提供者和门面模式
在laravel中,我们可能需要用到自己添加的类时,可以建立一个文件夹专门存放类文件,也可以使用laravel的服务提供者的方式来使用. 这两者其实区别不大,主要是前者使用的话,会跟业务代码产生依赖, ...
- Laravel服务容器的绑定与解析
本篇文章给大家带来的内容是关于Laravel服务容器的绑定与解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言 老实说,第一次老大让我看laravel框架手册的那天早上,我 ...
- laravel 服务容器实现原理
前言 通过实现laravel 框架功能,以便深入理解laravel框架的先进思想. 什么是服务容器 服务容器是用来管理类依赖与运行依赖注入的工具.Laravel框架中就是使用服务容器来实现 ** 控制 ...
- laravel服务容器
laravel框架底层解析 本文参考陈昊<Laravel框架关键技术解析>,搭建一个属于自己的简化版服务容器.其中涉及到反射.自动加载,还是需要去了解一下. laravel服务容器 建立项 ...
- laravel学习:php写一个简单的ioc服务管理容器
php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...
- 关于使用 Laravel 服务容器的优势介绍
如果说laravel框架的核心是什么,那么无疑是服务容器.理解服务容器的概念,对于我们使用laravel太重要了,应该说是否理解服务容器的概念是区分是否入门laravel的重要条件.因为整个框架正是在 ...
随机推荐
- Qt程序crash信息的捕捉与跟踪(转)
本文转自 https://blog.csdn.net/lanhy999/article/details/12189375
- VS MFC 改变AfxMessageBox标题 AFX_IDS_APP_TITLE
其实这个标题在资源String Table里就能找到,查找AFX_IDS_APP_TITLE,在这里你就能轻而易举的改变标题了. 注意:有的工程的资源String Table里面没有添加AFX_IDS ...
- UVA 10801 Lift Hopping 最短路
2种方式直接代码就可以了.注意首次不需要60S的转换 #include <map> #include <set> #include <list> #include ...
- "select一直返回0"的问题解决和总结
场景:一个简单的TCP 服务器,以实现UPNP的事件体系结构 我在linux平台下,创建一个TCP套接字,绑定到49156端口,向UPNP SERVER发一个subscribe订阅请求,超时时间设置为 ...
- python接口自动化1-发送get请求【转载】
本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python%E6%8E%A5%E5%8F%A3%E8%87%AA%E5%8A%A8%E ...
- vs2015 建立项目报错:值不能为空,参数名:path1的错误解决与“未将对象引用到对象的实例”
“值不能为空,参数名:path1” 的错误.原因就是安卓sdk的路径不正确. 最简单的解决办法如下: 找到C:\Program Files (x86)\Android\android-sdk.进入文件 ...
- 利用System.Net.Mail 发送邮件
我这里只是试了一下发mail的功能,感觉.net自带的发mail是比较全的,还是直接上我的code 参数文章:System.Net.Mail 发送邮件 SMTP协议 using System; usi ...
- (18)PL/SQL
PL/SQL(Procedure Language/SQL) PL/SQL是Oracle对sql语言的过程化扩展---指在sql命令语言中增加了过程处理语句(如分支.循环等),使sql语言具有过程处理 ...
- iframe和response.sendRedirect()跳转到父页面的问题
在项目中,因为为了给页面分层次,就使用了 内嵌iframe 的分了三个框.在子页面进行操作的时候,如果session超时,就要被拦截器拦截重新回到首页进行登录,但是在sub页 面 ,进行操作的时候,如 ...
- (转)stage 3d or unity 3d
这个是这样子的.stage3d如果不使用flascc的话,性能会卡在as上面.你没卡是因为你用的效果还不够高级.往深了走的高端应用就是卡as性能上.这不是你代码能优化了的.我们后来都改用flascc写 ...