资讯专栏INFORMATION COLUMN

Laravel思维导图之Laravel核心概念

wthee / 2422人阅读

摘要:的核心概念包括服务容器服务提供者门面契约。所有服务提供者都需要继承类。可以为服务提供者的方法设置类型提示。方法将在所有其他服务提供者均已注册之后调用。同样会整理成思维导图的形式以方便记忆与回顾。

Laravel 的核心概念包括:服务容器、服务提供者、门面(Facades)、契约(Contracts)。

服务容器是 Laravel 的核心,是一个 IoC 容器,是管理类依赖和运行依赖注入的有力工具。

服务提供者则提供服务并绑定服务至服务容器。是所有 Laravel 应用程序引导启动的中心所在。

Facades 为应用程序的服务容器中可用的类提供了一个「静态」接口。它实际上是服务容器中那些底层类的「静态代理」。

Laravel 的 契约(Contracts )是一系列框架用来定义核心服务的接口。

不管是契约还是门面都可以创建出强大的、容易测试的 Laravel 应用程序。

0x00 服务容器

Laravel 的核心就是一个 IoC 容器,该容器提供了整个框架中需要的一系列服务。

IoC(Inversion Of Control)控制反转,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。IoC 容器会根据类的依赖需求,自动在注册、绑定的一堆实例中搜寻符合的依赖需求,并自动注入到构造函数参数中去。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。这就是依赖注入(Dependency Injection, DI)。依赖注入实质上是指:类的依赖通过构造器或在某些情况下通过「setter」方法进行「注入」。

如何实现与服务容器的绑定?

几乎所有服务容器的绑定都是在服务提供者中进行的。在服务提供者内部,可以通过 $this->app 来访问容器的实例。

绑定的方式包括:

简单绑定

绑定一个单例

绑定实例

绑定接口到实现

情境绑定

绑定包括原始数据在内的初始数据

标记

其中,标记能够针对某种类别的所有做绑定。

如何从服务容器解析出对象?

绑定后可以从服务容器中解析出对象才能够使用。解析方法包括:

通过 make 方法,接收一个你想要解析的类或者接口

通过数组方式从容器中解析对象

自动注入

自动注入实例

下面的例子中,在控制器的构造函数中对应用程序定义的 Repository 使用类型提示。这样 Repository 实例会被自动解析并注入到类中:

users = $users;
    }

    /**
     * 显示指定 ID 的用户信息。
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        //
    }
}
0x01 服务提供者

Laravel 中,包括应用程序,以及所有的 Laravel 核心服务,都是通过服务提供者引导启动的。所谓的「引导启动」指的是注册事务,包括注册服务容器绑定,事件监听器,中间件,甚至路由。

所有服务提供者都需要继承 IlluminateSupportServiceProvider 类。大多数服务提供者都包含 register 和 boot 方法。register 方法中,只能将事务绑定到 服务容器。不应该在 register 方法中尝试注册任何事件监听器,路由或者任何其他功能。可以为服务提供者的 boot 方法设置类型提示。服务容器会自动注入需要的任何依赖。boot 方法将在所有其他服务提供者均已注册之后调用。

所有服务提供者都在 config/app.php 配置文件中注册。可以选择推迟服务提供者的注册,直到真正需要注册绑定时,这样可以提供应用程序的性能。

0x02 门面(Facades)

Facades 工作原理

在 Laravel 应用中,一个 facade 就是一个提供访问容器中对象的类。其中核心的部件就是 Facade 类。不管是 Laravel 自带的 Facades ,还是用户自定义的 Facades ,都继承自 IlluminateSupportFacadesFacade 类。

Facade 基类使用 __callStatic() 魔术方法在你的 Facades 中延迟调用容器中对应对象的方法,在下面的例子中,调用了 Laravel 的缓存系统。在代码里,我们可能认为是 Cache 类中的静态方法 get 被调用了:

 $user]);
    }
}

注意在代码的最上面,我们导入的是 Cache facade 。这个 facade 其实是我们获取底层 IlluminateContractsCacheFactory 接口实现的一个代理。我们通过这个 facade 调用的任何方法,都会被传递到 Laravel 缓存服务的底层实例中。

如果我们看一下 IlluminateSupportFacadesCache 这个类,你会发现类中根本没有 get 这个静态方法:

class Cache extends Facade
{
    /**
     * 获取组件在容器中注册的名称。
     *
     * @return string
     */
    protected static function getFacadeAccessor() { return "cache"; }
}

其实,Cache facade 是继承了 Facade 基类,并且定义了 getFacadeAccessor() 方法。这个方法的作用是返回服务容器中对应名字的绑定内容。当用户调用 Cache facade 中的任何静态方法时, Laravel 会解析到服务容器中绑定的键值为 cache 实例对象,并调用这个对象对应的方法(在这个例子中就是 get 方法)。

0x03 契约(Contracts)

如何使用契约?

Laravel 中的许多类型的类都是通过 服务容器 解析出来的。包括控制器、事件监听器、中间件、任务队列,甚至路由的闭包。所以说,要获得一个契约的实现,你只需要解析在类的构造函数中相应的类型约束即可。

例如,看看这个事件监听器,当事件监听器被解析时,服务容器会从构造函数里读取到类型约束,并注入对应的值。

redis = $redis;
    }

    /**
     * 处理事件。
     *
     * @param  OrderWasPlaced  $event
     * @return void
     */
    public function handle(OrderWasPlaced $event)
    {
        //
    }
}
下一步

Laravel 作为“为 Web 艺术家创造的 PHP 框架”,接下来我将学习其中最重要的内容之一 HTTP 层的相关知识。同样会整理成思维导图的形式以方便记忆与回顾。

这些文章都将首发在微信公众号:up2048 上。欢迎大家扫描下面的二维码,我们一起学习,分享,讨论,反思。

思维导图导出为图片时会导致其变模糊。若需要高清的思维导图源文件,请关注微信公众号:up2048,并回复“精进脑图”来获取。

- EOF -

推荐阅读

Laravel思维导图之Laravel入门指南

十五张思维导图带你快速学习PHP言语基础

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25701.html

相关文章

  • Laravel思维图之Laravel HTTP路由、中间件、控制器

    摘要:又限于层的内容太多,我在这篇中将整理路由中间件控制器部分内容。前者定义页面路由,默认应用中间件组后者定义无状态路由,会应用中间件组。命名路由可以为指定路由或者控制器方法命名,也可以为已命名的路由生成。 showImg(https://segmentfault.com/img/remote/1460000010882838); 上图列出了 Laravel HTTP 层的相关知识大纲。由于...

    linkin 评论0 收藏0
  • Laravel思维图之HTTP请求、响应、表单验证

    摘要:今天我来分享中层关于请求响应与表单验证的知识。手动创建验证请求之前的内容是直接使用的方法来实现表单验证。下一步到这篇为止,我完成了入门指南核心概念层的路由中间件控制器请求响应表单验证的学习和整理。 showImg(https://segmentfault.com/img/remote/1460000010882838); 今天我来分享 Laravel 中 HTTP 层关于请求、响应与表...

    lewif 评论0 收藏0
  • Laravel思维图之Laravel入门指南

    摘要:本系列思维导图整理自版本官方文档。思维导图导出为图片时会导致其变模糊。需要高清的思维导图源文件,请关注微信公众号,并回复精进脑图来获取。今天我们就通过张思维导图来快速看入门指南。这些文章都将首发在微信公众号上。 showImg(https://segmentfault.com/img/remote/1460000010774258); 本系列思维导图整理自 Laravel 5.4 版...

    vibiu 评论0 收藏0
  • 记一次 Laravel 应用性能调优经历

    摘要:为了一探究竟,于是开启了这次应用性能调优之旅。使用即时编译器和都能轻轻松松的让你的应用程序在不用做任何修改的情况下,直接提高或者更高的性能。 这是一份事后的总结。在经历了调优过程踩的很多坑之后,我们最终完善并实施了初步的性能测试方案,通过真实的测试数据归纳出了 Laravel 开发过程中的一些实践技巧。 0x00 源起 最近有同事反馈 Laravel 写的应用程序响应有点慢、20几个并...

    warkiz 评论0 收藏0
  • 十五张思维导图带你快速学习PHP语言基础

    摘要:思维导图导出为图片时会导致其变模糊。需要高清的思维导图源文件,请关注微信公众号,并回复精进脑图来获取。下面我们就通过张思维导图来快速学习语言基础。这些文章都将首发在微信公众号上。 showImg(https://segmentfault.com/img/remote/1460000010743585); 在打算系统的学习 Laravel 之前,我抽空看了 PHP 语言基础,并且绘制了...

    xialong 评论0 收藏0

发表评论

0条评论

wthee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<