刨析laravel源码之中间件原理

在看了laravel关于中间件的源码和参考了相关的书籍之后,写了一个比较简陋的管道和闭包实现,代码比较简单,但是却不好理解所以还是需要多写多思考才能想明白其中的意义。代码如下,权当自己的笔记吧。

管道实现

interface Pipeline
{
public function go();
} class Animal implements Pipeline
{
protected $name;
public function __construct($name)
{
$this->name = $name;
}
public function go()
{
echo $this->name.PHP_EOL;
} } class Cat extends Animal
{
protected $pip;
public function __construct(Pipeline $pip)
{
$this->pip = $pip;
}
public function go()
{
echo __CLASS__.PHP_EOL;
$this->pip->go();
}
} class Dog extends Animal
{
protected $pip;
public function __construct(Pipeline $pip)
{
$this->pip = $pip;
}
public function go()
{
echo __CLASS__.PHP_EOL;
$this->pip->go();
echo "呵呵哒";
}
} $animal = new Animal("Tom");
$cat = new Cat($animal);
$dog = new Dog($cat);
$dog->go();

执行结果:

Dog

Cat

Tom

呵呵哒

闭包实现

interface Middleware
{
public static function echoName(Closure $next);
} class BeforeMiddleware implements Middleware
{
public static function echoName(Closure $next)
{
echo "before".PHP_EOL;
$next();
echo "after".PHP_EOL;
}
} function Func($func,$className)
{
if($func instanceof $func){
return function() use($func,$className){
return $className::echoName($func);
};
}
} $objs = ['BeforeMiddleware'];
$func = function(){echo "test code".PHP_EOL;};
$go = array_reduce($objs,"Func",$func);
$go();

输出结果为:

before

test code

after

关于中间件这部分的设计模式,主要还是用到的装饰器模式,但是使用的却很灵活,所以还是要多使用,才能真正的吃透这块。

代码写的很简单,但是这只是一个跳板,理解这部分之后再去观看关于中间件部分就会更好的理解了。

学习laravel源码之中间件原理的更多相关文章

  1. 学习 vue 源码 -- 响应式原理

    概述 由于刚开始学习 vue 源码,而且水平有限,有理解或表述的不对的地方,还请不吝指教. vue 主要通过 Watcher.Dep 和 Observer 三个类来实现响应式视图.另外还有一个 sch ...

  2. laravel源码解析

    本专栏系列文章已经收录到 GitBooklaravel源码解析 Laravel Passport——OAuth2 API 认证系统源码解析(下)laravel源码解析 Laravel Passport ...

  3. Android 网络框架之Retrofit2使用详解及从源码中解析原理

    就目前来说Retrofit2使用的已相当的广泛,那么我们先来了解下两个问题: 1 . 什么是Retrofit? Retrofit是针对于Android/Java的.基于okHttp的.一种轻量级且安全 ...

  4. DotNetty网络通信框架学习之源码分析

    DotNetty网络通信框架学习之源码分析 有关DotNetty框架,网上的详细资料不是很多,有不多的几个博友做了简单的介绍,也没有做深入的探究,我也根据源码中提供的demo做一下记录,方便后期查阅. ...

  5. MyBatis 源码分析 - 缓存原理

    1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...

  6. Tomcat源码分析——请求原理分析(上)

    前言 谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多人早期的J2EE项目,由程 ...

  7. Laravel源码解析--看看Lumen到底比Laravel轻在哪里

    在前面一篇<Laravel源码解析--Laravel生命周期详解>中我们利用xdebug详细了解了下Laravel一次请求中到底做了哪些处理.今天我们跟 Lumen 对比下,看看 Lume ...

  8. 从微信小程序开发者工具源码看实现原理(一)- - 小程序架构设计

    使用微信小程序开发已经很长时间了,对小程序开发已经相当熟练了:但是作为一名对技术有追求的前端开发,仅仅熟练掌握小程序的开发感觉还是不够的,我们应该更进一步的去理解其背后实现的原理以及对应的考量,这可能 ...

  9. 一起学习vue源码 - Object的变化侦测

    作者:小土豆biubiubiu 博客园:www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e894d 简书:h ...

随机推荐

  1. 【转载】malloc内存分配与free内存释放的原理

    原文:http://www.cnblogs.com/huhuuu/p/3456662.html 前段时间一直想看malloc的原理,在搜了好几篇malloc源码后遂放弃,晦涩难懂. 后来室友买了本深入 ...

  2. 04 - django的路由层 1

    1.路由控制简单配置 from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003 ...

  3. 【HNOI2014】米特运输

    题面 题解 首先我们需要看懂题目 然后我们需要发现一个结论 只要有一个节点的权值确定,那么整棵树的权值就确定了 就像这样:(图片来源于网络,侵删) 然后我们根据这张图片,可以设\(f[i] = a[i ...

  4. 在eclipse中运行spring web application时的异常: java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

    严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderLis ...

  5. check the manual that corresponds to your MySQL server version for the right syntax to use near

    一.问题 mysql插入数据时报错 sql如下 insert into t_sysconfig (servercode,key,value,remark,updatetime) values (&qu ...

  6. Jenkins持续部署

    Jenkins持续部署 Jenkins提供很好的连续部署和交付的支持.看一下部署任何软件开发的流程,将如下图所示. 连续部署的主要部分,是确保其上面所示的整个过程是自动化的.Jenkins实现所有这些 ...

  7. WebGL之sprite精灵效果显式数字贴图

    接着前一篇<WebGL实现sprite精灵效果的GUI控件>,我们继续开发我们的数字系统GUI控件,因为这套数字系统是基于sprite效果的,所以数字随相机转动而旋转(永远面对相机),随场 ...

  8. python属性访问

    1.python属性访问魔法方法: >>> class C: def __getattribute__(self,name): print("getattribute&qu ...

  9. linux shell 完成批量压缩文件

    首先得到文件列表 使用 list -1 注意是1 不是l 然后是用一个循环内包装zip代码 #!/bin/bash list=`` for var in $list do echo $var zip ...

  10. elementUI实现前端分页

    按照他的文档来写分页,最主要的是el-table里面展示的数据怎么处理 <el-table :data="AllCommodityList.slice((currentPage-1)* ...