Service Provider:

一个laravel service provider就是一个注册IoC container binding的类。实际上,laravel本身就自包含了一堆管理核心框架组件的container binding的service provider. 一个service provider必须具有至少一个方法: register. 该方法就是执行该service provider绑定其暴露给laravel ioc container的类库的函数。当一个请求进入到application,而框架本身booting up时,那么所有在app.php中定义的service provider的register函数将被调用。这个过程在applicaiton的life cycle很早就发生了,因此当你bootup你自己的文件时,这些laravel service就已经可用了,比如所有在start目录中定义的自己的代码。

注意:永远不要在register方法中使用laravel的services,因为这个函数只用来绑定objects到ioc container.所有解析和调用相关bounded class的工作必须在service provider的boot函数中调用。(在所有的service providers被成功注册后,这些组件就进入booted状态,这时将会调用每个service provider的boot函数。通常boot函数可以做任何你想做的事情,比如register event listener,包含一个route file,register filter等等)

注意:并不是所有第三方的pacakges都需要一个service provider.事实上,甚至不需要service provider来保证第三方组件正常工作,原因是service provider本身只完成bootstrap component的功能(注册给ioc container)。不过service provider确实提供了一个组织第三方component的bootstrap代码及binding ioc的一个方便的地方,值得使用!

为了提高laravel的性能,laravel本身提供了deferred service provider的概念。比如QueueServiceProvider只有在确实需要queue时才初始化,而在一般的request中并不需要。这个机制通过如下方法实现: app/storage/meta目录保存了所谓service manifest列表,该列表列出所有的ioc binding name和其serivce provider对应关系。这样,当application请求container要求queue container binding时,laravel就知道它需要初始化queue对象,因此执行QueueServiceProvider来实例化。这样就允许了laravel实现lazy-load service provider for each request,大大提高了性能。

separate concerns

一个好的设计可能有一下就能实现:separating responsibilities, creating layers of responsibility.  controllers are responsible for receiving an HTTP request and calling the proper business layer classes.你的business/domain layer才是你的应用。她包含retrieve data, validate data, process payments, send e-mail andother functionality。

事实上,你的domain layer根本无需知道“the web”! The web is simply a transport mechanism to access your application, and knowledge of the web and HTTP need not go beyond the routing and controller layers.

Classname::class解释

namespace MyProject;
class Alpha{ } namespace MyOtherProject;
class Beta{ } echo Alpha::class; // displays: MyProject\Alpha
echo Beta::class; // displays: MyOtherProject\Beta

自从PHP5.5,class关键字也被用来作为class name resolution.你可以通过使用ClassName::class来获取一个包含fully qualified name.这个功能对于namespaced class非常有用!!

laravel重要概念和知识点的更多相关文章

  1. Android开发涉及有点概念&相关知识点(待写)

    前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...

  2. IOS开发涉及有点概念&相关知识点

    前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...

  3. Laravel 核心概念

    工欲善其事,必先利其器.在开发Xblog的过程中,稍微领悟了一点Laravel的思想.确实如此,这篇文章读完你可能并不能从无到有写出一个博客,但知道Laravel的核心概念之后,当你再次写起Larav ...

  4. 小白也能看懂的 Laravel 核心概念讲解

    自动依赖注入 什么是依赖注入,用大白话将通过类型提示的方式向函数传递参数. 实例 1 首先,定义一个类: /routes/web.php class Bar {} 假如我们在其他地方要使用到 Bar  ...

  5. Java中继承,类的高级概念的知识点

    1. 继承含义 在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类,这种方式称为继承(inheritance). 2. 继承的优点 A.代码的可重用性 B.子类可以扩 ...

  6. 第二章--Win32程序运行原理 (部分概念及代码讲解)

    学习<Windows程序设计>记录 概念贴士: 1. 每个进程都有赋予它自己的私有地址空间.当进程内的线程运行时,该线程仅仅能够访问属于它的进程的内存,而属于其他进程的内存被屏蔽了起来,不 ...

  7. Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序

    Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framew ...

  8. laravel学习资料

    http://blog.csdn.net/qq_20873039/article/category/6246852   --laravel核心概念 /Eloquent ORM / laravel bl ...

  9. kubernetes 基本概念和资源对象汇总

    kubernetes 基本概念和知识点脑图 基本概念 kubernetes 中的绝大部分概念都抽象成kubernets管理的资源对象,主要有以下类别: Master : Master节点是kubern ...

随机推荐

  1. linux yum 命令 详解

    linux yum命令详解 yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能 ...

  2. samsung-smart app 开发

    http://www.samsungdforum.com/ http://seller.samsungapps.com/login/signIn.as?returnURL=%2fmain%2fsell ...

  3. Sqli-labs less 35

    Less-35 35关和33关是大致的一样的,唯一的区别在于sql语句的不同. $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1"; ...

  4. String、StringBuilder

    public class testString{ public static void main(String[] args) { String a="cool"; String ...

  5. zend studio插件

    1.安装使用Aptana插件(html,css,js代码提示功能) 安装步骤: 1).zend studio->Help->Install New Software->work wi ...

  6. Python中编码问题?

    一.键盘输入 raw_input('请输入:'.decode('utf-8').encode('gbk'))raw_input(unicode('请输入:','utf-8').encode('gbk' ...

  7. POJ 2092

    #include <iostream> #include <algorithm> #define MAXN 10005 using namespace std; int _m[ ...

  8. PATH环境变量和CLASSPATH环境变量详解

    大凡装过JDK的人都知道要安装完成后要设置环境变量,可是为什么要设置环境变量呢?环境变量有什么作用? 1)PATH详解: 计算机安装JDK之后,输入“javac”“java”之类的命令是不能马上被计算 ...

  9. 使用时间戳引入css、js文件

    前言 最近在一家创业公司实习,主要负责新版官网和商家平台管理系统的前端开发和维护,每次测试都要上传文件到ftp服务器端测试,初期由于更新修改比较频繁,每次都是直接上传覆盖css.js.php文件,链接 ...

  10. windows JDK 版本切换

    windows JDK 版本切换1. HKEY_LOCAL_MACHINE“SOFTWARE“JavaSoft“Java Runtime Environment“CurrentVersion, 把这个 ...