Laravel框架的核心架构,你懂多少?

Laravel框架的核心架构,你懂多少?

大家好,又见面了,我是全栈君。

使用过larave框架的朋友都知道laravel框架里面除了提供一些基本的功能(如控制器、视图、模型)之外,还有中间件、门面、契约等,这些东西是如何在laravel框架运用起来的呢?

首先应该了解laravel框架的架构模式(设计核心,laravel 框架是使用服务组件化的开发模式开发的,laravel框架就是由不同的服务组件构成的)

laravel 里面多个服务提供者构成了laravel组件。分层设计:把相同功能的类库放在同一个文件夹里面。
laravel框架有多个类组成服务,由多个服务组成组件。类  -> 服务  ->  组件
laravel使用组件化的开发模式,多个类 -> 服务 -> 组件,多个类组成服务,多个服务构成组件。

多个组件提供不同的服务,然后多个服务构成我们的项目。

请求生命周期
大概的流程如图:
Laravel框架的核心架构,你懂多少?

理论上,生命周期主要有这么些阶段,但其中,开发者大多数只需关注路由、中间件、控制器、闭包函数、逻辑处理等几步
当然,每一步的内部,还是会有更多细化的执行流程,在这里,一般不深入研究框架或改造框架,很少会细化研究,但研究底层,依旧是学习的好选择。

服务
说的就是提供给你所需要的东西,在laravel里面所提供的服务有 认证服务、数据库服务、缓存服务、队列服务等等。laravel框架所有服务都定义在了app/config/app.php 里面

服务提供者
可以给你提供一组服务的东西就是服务提供者,laravel里面如上所示其实定义的服务器提供者,比如IlluminateAuthAuthServiceProvider::class,提供认证服务的服务提供者。IlluminateCacheCacheServiceProvider::class,提供缓存服务的服务提供者

好处:开发者可以节省下更多的精力去处理项目逻辑,且不同开发个体之间能达到一定默契,最重要的是,项目达到分层解耦,业务逻辑只依赖于服务,并不依赖于服务底层的实现。
解耦之后,我们可以任意升级或自定义服务的底层实现,只要确保底层类实现了该服务

总结:其实服务是一个抽象的概念,服务器提供者是完成这个抽象概念的具体实施者

服务容器
把所有的服务放在一个盒子里,存放服务的容器。laravel里面的服务容器位于 

vendor/laravel/frameworksrcilluminateContainerContainer.php.

Container.php 就是laravel框架的服务容器。

契约
用来规划服务提供者的格式、方法、参数等,给服务提供者规范了一定约束。所以在框架里面所有的契约都是接口,这样才能规范服务提供者。

门面
门面再一次展示了Laravel在设计上的优秀,它让Laravel变得更加灵活易扩展,那么它的概念是:
1 为开发者提供服务容器中服务的静态代理
2 它对服务访问方式做了补充,之前使用服务必须获取服务的实例,再调用服务的方法,但使用facade,就可以直接把服务当静态对象来调用了。
3 config/app.php中服务别名alias大多数都使用了facade
4 使用facade是有风险的,并不是用的越多越好,这在手册上有少量的介绍,但具体的,还是需要开发中去发现

laravel框架总体架构图
Laravel框架的核心架构,你懂多少?
如上图所示:laravel框架是由多个服务组件构成的 -> 服务提供者(最下面的不同的服务组件)。
Foundation 的 Application 用来创建服务提供者,创建好之后保存在Container 的 Container 的服务容器里面,交由他管理,Application 要继承 Container。
为了约定服务提供者提供的服务,我们定义一个规范,这就是契约

对于我们的用户(最上面的用户)想使用laravel框架,必须通过控制器来使用(上面的Controller),使用laravel框架主要是使用laravel里面的服务提供者(上面的 new 服务),这样就是最传统的开发模式,和服务器容器没有直接关系,如果laravel这样设计的话,基本上和其他框架一样,没有任何优势。所以一般不怎么做。

由于有契约,契约是服提供者的接口,所以我们也可以直接使用契约,new 服务旁边的黄色线。使用契约用注入的方式,这样使用的不好之处是如果一个方法里面使用多个契约的话,我们就得注入多个契约,这样代码看起来不优雅。

于是laravel里面就出现了门面,门面的出现方便我们优雅的调用服务器提供者的类。由于每个服务提供者的类太长了如:

IlluminateCookieCookieServiceProvider::class,
IlluminateDatabaseDatabaseServiceProvider::class,

所以又引出了别名,使用别名之后 简化了我们调用的服务提供者的类。

事件:laravel里面的模型里面的事件,比如用户对数据库操作时做的一个监听。对整个项目运行进行监听,有监听的动作。类似tp5里面的钩子和行为。
中间件:做用户的请求做一定的过滤。

Laravel框架的核心架构,你懂多少?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111529.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • js 做返回顶部效果

    js 做返回顶部效果涉及的知识点: font-awesome字体图标;使用的cdn。 window.onload窗口加载完成事件;如果js代码写在body标签之前,则所有的js都要写在window.onload的事件中;即等待窗口加载完成之后再执行! window.onscroll窗口滚动事件 窗口滚动的距离      document.documentEleme…

  • ups不间断电源介绍_ups不间断电源设备有哪几部分组成

    ups不间断电源介绍_ups不间断电源设备有哪几部分组成本文简单介绍UPS(不间断电源)的相关知识。1概述UPS(UninterruptedPowerSupply),即不间断电源,是将蓄电池与主机相连接,通过主机逆变器等模块电路,将蓄电池中直流(DC,DirectCurrent)电转换成市电交流(AC,AlternatingCurrent)电的系统设备。UPS主要用于给单台计算机、计算机网络系统或其它电力电子设备如电磁阀、压力变送器…

    2022年10月27日
  • coturn 搭建 stun turn 服务器

    coturn 搭建 stun turn 服务器coturn搭建stun/trun服务器分享经验总结,欢迎加入简介STUN,首先在RFC3489中定义,作为一个完整的NAT穿透解决方案,英文全称是SimpleTraversalofUDPThroughNATs,即简单的用UDP穿透NAT。STUN(SimpleTraversalofUserDatagramProtocolThroughNetworkAddressTranslators),即简单的用UDP穿透NAT,是个轻量级的协议,是基于UDP的完整的穿

  • POI导出excel执行公式 公式不生效问题[通俗易懂]

    POI导出excel执行公式 公式不生效问题[通俗易懂]excel模板设置好公式即可。在下面这行代码:workbook.write(out);// 输出Excel内容,生成Excel文件 之前,添加这个语句:workbook.setForceFormulaRecalculation(true);// 执行公式。workbook.setForceFormulaRecalculation(true);// 执行公式workbook.write(out);// 输出Excel内容,生成Excel文件…

  • Google资深工程师深度讲解Go语言-channel 通道 (十)

    Google资深工程师深度讲解Go语言-channel 通道 (十)

  • linux中用户态和内核态是什么_用户态内核

    linux中用户态和内核态是什么_用户态内核内核态:操作系统在内核态运行——运行操作系统程序用户态:应用程序只能在用户态运行——运行用户程序当一个进程在执行用户自己的代码时处于用户运行态(用户态),此时特权级最低,为3级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。Ring3状态不能访问Ring0的地址空间,包括代码和数据;当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),此时特权级最高,为0级。执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号