Laravel的核心概念包括:服务容器、服务提供者、门面(Facades)、契约(Contracts)。在Laravel的核心,服务容器是一个IoC容器,是管理类依赖和运行依赖注入的强大工具。服务提供者提供服务并将服务绑定到服务容器。所有Laravel应用程序引导的中心。Facades为应用程序服务容器中可用的类提供一个“静态”接口。它实际上是服务容器中那些底层类的“静态代理”。Laravel的契约(Contracts)是框架用来定义核心服务的一系列接口。契约和门面都可以创建健壮的、易于测试的Laravel应用程序。0x00服务容器Laravel的核心是一个IoC容器,它提供了整个框架所需要的一系列服务。IoC(InversionOfControl)是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度。IoC容器会根据类的依赖需求,自动在一堆已注册绑定的实例中寻找匹配的依赖需求,并自动注入到构造函数参数中。通过控制反转,当一个对象被创建时,它所依赖的对象的引用由一个外部实体传递给它,这个外部实体调节系统中的所有对象。也可以说依赖注入到对象中。这就是依赖注入(DependencyInjection,DI)。依赖注入本质上是指通过构造函数或在某些情况下通过“setter”方法“注入”类的依赖关系。如何实现与服务容器的绑定?服务容器的几乎所有绑定都发生在服务提供者中。在服务提供者内部,可以通过$this->app访问容器的实例。绑定方式包括:简单绑定、绑定单例绑定实例、绑定接口实现上下文绑定、绑定初始数据包括原始数据、标记。其中,标记可以绑定某个类别的所有对象。如何解析来自服务容器的对象?绑定后,对象可以从服务容器中解析出来,然后才能使用。分析方法包括:通过make方法,接收一个你要分析的类或接口,使用数组从容器中解析出对象。自动注入和自动注入实例下面的例子中,控制器的构造函数中使用了应用程序定义的RepositoryTypehints。这样Repository实例会自动解析注入到类中:*/受保护的$users;/***控制器构造函数。**@paramUserRepository$users*@returnvoid*/publicfunction__construct(UserRepository$users){$this->users=$users;}/***显示指定ID的用户信息。**@paramint$id*@returnResponse*/publicfunctionshow($id){//}}0x01服务提供者在Laravel中,包括应用程序,以及所有Laravel核心服务,都是通过服务提供者引导启动的。所谓“bootstrapping”是指注册事务,包括注册服务容器绑定、事件监听器、中间件,甚至路由。所有服务提供者都需要继承IlluminateSupportServiceProvider类。大多数服务提供者都包含注册和引导方法。在register方法中,事务只能绑定到服务容器上。您不应尝试在注册方法中注册任何事件侦听器、路由或任何其他功能。可以为服务提供商的引导方法设置类型提示。服务容器将自动注入它需要的任何依赖项。引导方法将在所有其他服务提供者注册后调用。所有服务提供者都在config/app.php配置文件中注册。可以选择将服务提供者的注册推迟到实际需要注册绑定时,这可以提高应用程序性能。0x02FacadesFacades的工作原理在Laravel应用程序中,Facades是一个提供对容器中对象的访问的类。核心组件是Facade类。无论是Laravel自带的Facades还是用户自定义的Facades,都是继承自IlluminateSupportFacadesFacade类。Facade基类使用__callStatic()魔术方法延迟调用Facades容器中相应对象的方法,在下面的示例中,调用Laravel的缓存系统。在代码中,我们可能会认为调用了Cache类中的静态方法get:{/***显示给定用户的一般信息。**@paramint$id*@returnResponse*/publicfunctionshowProfile($id){$user=Cache::get('user:'.$id);returnview('profile',['user'=>$user]);}}请注意,在代码的顶部,我们导入了Cachefacade。这个facade其实就是代理我们去获取底层IlluminateContractsCacheFactory接口的实现。我们通过这个门面调用的任何方法都将传递给Laravel缓存服务的底层实例。如果我们查看IlluminateSupportFacadesCache类,你会发现类中并没有get静态方法:classCacheextendsFacade{/***获取容器中注册的组件名称。**@returnstring*/受保护的静态函数getFacadeAccessor(){return'cache';}}其实Cache门面继承了Facade基类,定义了getFacadeAccessor()方法。该方法的作用是返回服务容器中对应名称的绑定内容。当用户调用Cachefacade上的任何静态方法时,Laravel会将服务容器中的绑定键解析为缓存实例对象,并调用该对象对应的方法(本例中为get方法)。0x03合约(Contracts)如何使用合约?Laravel中很多类型的类都是由服务容器来解析的。闭包包括控制器、事件监听器、中间件、任务队列,甚至路由。所以,要获得一个契约的实现,只需要在类的构造函数中解析对应的类型约束即可。比如看这个事件监听器,当事件监听器被解析后,服务容器会从构造函数中读取类型约束,并注入相应的值。redis=$redis;}/***处理事件。**@paramOrderWasPlaced$event*@returnvoid*/publicfunctionhandle(OrderWasPlaced$event){//}}下一步Laravel作为“为网络艺术家创建的PHP框架”,接下来我将学习最重要的内容之一HTTP层的相关知识。也会整理成思维导图,方便记忆和复习。这些文章将第一时间发布在微信公众号:up2048。欢迎大家扫描下方二维码,一起学习、分享、讨论、反思。将思维导图导出为图像会导致它变得模糊。如需高清思维导图源文件,请关注微信公众号:up2048,回复“精进思维导图”获取。-EOF-推荐阅读Laravel思维导图的Laravel入门指南。十五张思维导图带你快速学习PHP语言基础知识
