对于Laravel 5.5核心架构的深入理解


Posted in PHP onFebruary 22, 2018

前言

本文主要给大家介绍了关于Laravel 5.5核心架构的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

1、依赖注入

方法传入组件名,框架会自动实例化,方法内可直接使用

例如最常用的requert对象

对于Laravel 5.5核心架构的深入理解

2、服务容器

其实,Laravel 的核心就是一个 IoC 容器,Laravel 的核心本身十分轻量,并没有什么很神奇很实质性的应用功能。很多人用到的各种功能模块比如 Route(路由)、Eloquent ORM(数据库 ORM 组件)、Request(请求)以及Response(响应)等等等等,实际上都是与核心无关的类模块提供的,这些类从注册到实例化,最终被你所使用,其实都是 Laravel 的服务容器负责的。

服务提供者主要分为两个部分,register(注册) 和boot(引导、初始化)

3、服务提供者

一个类要被容器所能够提取,必须要先注册至这个容器。既然 Laravel 称这个容器叫做服务容器,那么我们需要某个服务,就得先注册、绑定这个服务到容器,那么提供服务并绑定服务至容器的东西,就是服务提供者(Service Provider)。

4、向IOC 容器添加自己的类

4.1、新建validate类

对于Laravel 5.5核心架构的深入理解

4.2、新建validateProvider

对于Laravel 5.5核心架构的深入理解

4.3、绑定validate类到Provider

<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ValidateProvider extends ServiceProvider
{
 /**
 * Bootstrap the application services.
 *
 * @return void
 */
 public function boot()
 {
 //
 }

 /**
 * Register the application services.
 *
 * @return void
 */
 public function register()
 {
 $this->app->bind('valicate',function(){
  return new Validate();
 });
 }
}

4.4、添加Provider到IOC容器

对于Laravel 5.5核心架构的深入理解

4.5、使用

对于Laravel 5.5核心架构的深入理解

4.6、成功!

对于Laravel 5.5核心架构的深入理解

5、门面(facade)

facade用来提供统一的接口,比如无论你用哪种cache,redis还是memcache,客户端都可以用cache::get()方式来获取value,至于具体是用了redis还是memcahe,就看你在sevice provider里面绑定了哪个。cache::get()的实现方式是,继承Facade方法getFacadeAccessor,返回你在容器中绑定的key值,比如cache,然后Facade类会使用php魔术变量__callstatic(),callstatic的逻辑里面会从container里解析cache所绑定的服务,就是前面提到的service provider绑定了谁

5.1、例如config/app.php里的mail

对于Laravel 5.5核心架构的深入理解

5.2、这个类只返回一个mailer

对于Laravel 5.5核心架构的深入理解

5.3、如果调用它的send方法,不存在的话会进入到callstatic的魔术方法

对于Laravel 5.5核心架构的深入理解

5.4、这个方法会得到mailer的实例,即app('mailer')

对于Laravel 5.5核心架构的深入理解

对于Laravel 5.5核心架构的深入理解

5.5、这个实例便能调用mailer类的send方法

对于Laravel 5.5核心架构的深入理解

6、契约

Laravel 的契约是一组定义框架提供的核心服务的接口。例如,Illuminate\Contracts\Queue\Queue契约定义了队列任务所需的方法,而Illuminate\Contracts\Mail\Mailer契约定义了发送电子邮件所需的方法。框架对每个契约都提供了相应的实现。

好处是实现了程序的低耦合和简单性。

低耦合#

首先,让我们来看一些高耦合缓存实现的代码。如下:

<?php
namespace App\Orders;
class Repository
{
 /**
 * 缓存实例。
 */
 protected $cache;
 /**
 * 创建一个仓库实例。
 *
 * @param \SomePackage\Cache\Memcached $cache
 * @return void
 */
 public function __construct(\SomePackage\Cache\Memcached $cache)
 {
 $this->cache = $cache;
 }

 /**
 * 按照 Id 检索订单
 *
 * @param int $id
 * @return Order
 */
 public function find($id)
 {
 if ($this->cache->has($id)) {
  //
 }
 }
}

这个类中,程序跟给定的缓存实现高耦合。因为我们依赖于一个扩展包的特定缓存类。一旦这个扩展包的 API 被更改了,我们的代码就必须跟着改变。

同样的,如果我们想要将底层的的缓存技术( Memcached )替换为另一种缓存技术( Redis ),那又得再次修改这个repository类。而repository类不应该了解太多关于谁提供了这些数据或是如何提供的等等。

比起上面的做法,我们可以使用一个简单的、与扩展包无关的接口来改进我们的代码:

<?php
namespace App\Orders;
use Illuminate\Contracts\Cache\Repository as Cache;
class Repository
{
 /**
 * 缓存实例。
 */
 protected $cache;

 /**
 * 创建一个仓库实例。
 *
 * @param Cache $cache
 * @return void
 */
 public function __construct(Cache $cache)
 {
 $this->cache = $cache;
 }
}

现在,更改之后的代码没有与任何扩展包甚至是 Laravel 耦合。而契约扩展包不包含任何实现和依赖项,你可以轻松地写任何给定契约的替代实现,来实现不修改任何关于缓存消耗的代码就可以替换缓存实现。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
剖析 PHP 中的输出缓冲
Dec 21 PHP
PHP nl2br函数 将换行字符转成 &amp;lt;br&amp;gt;
Aug 21 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
Oct 29 PHP
查找mysql字段中固定字符串并替换的几个方法
Sep 23 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
PHP Error与Logging函数的深入理解
Jun 03 PHP
PHP按行读取文件时删除换行符的3种方法
May 04 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
Nov 27 PHP
php结合web uploader插件实现分片上传文件
May 10 PHP
CI框架中数据库操作函数$this-&gt;db-&gt;where()相关用法总结
May 17 PHP
PHP实现二维数组去重功能示例
Jan 12 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
php 广告点击统计代码(php+mysql)
Feb 21 #PHP
详细解读php的命名空间(二)
Feb 21 #PHP
详细解读php的命名空间(一)
Feb 21 #PHP
thinkphp5 migrate数据库迁移工具
Feb 20 #PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 #PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 #PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 #PHP
You might like
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
PHP 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
从零开始学习jQuery (六) jquery中的AJAX使用
2011/02/23 Javascript
jQuery操作input type=radio的实现代码
2012/06/14 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
js带前后翻页的图片切换效果代码分享
2015/09/08 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
AngularJs ng-change事件/指令的用法小结
2017/11/01 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
详解vue-cli3开发Chrome插件实践
2019/05/29 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
JS实现页面侧边栏效果探究
2021/01/08 Javascript
Python运算符重载用法实例分析
2015/06/01 Python
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
Python基于滑动平均思想实现缺失数据填充的方法
2019/02/21 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
Win10下用Anaconda安装TensorFlow(图文教程)
2020/06/18 Python
python字典通过值反查键的实现(简洁写法)
2020/09/30 Python
HTML5标签与HTML4标签的区别示例介绍
2013/07/18 HTML / CSS
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
中东奢侈品市场:Coveti
2019/05/12 全球购物
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
简述安装Slackware Linux系统的过程
2012/05/08 面试题
医学院护理专业应届生求职信
2013/11/12 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
爱牙日活动总结
2014/08/29 职场文书
求职简历自我评价怎么写
2015/03/10 职场文书
幼儿园小朋友毕业感言
2015/07/30 职场文书
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技