学习laravel源码之中间件原理
刨析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源码之中间件原理的更多相关文章
- 学习 vue 源码 -- 响应式原理
概述 由于刚开始学习 vue 源码,而且水平有限,有理解或表述的不对的地方,还请不吝指教. vue 主要通过 Watcher.Dep 和 Observer 三个类来实现响应式视图.另外还有一个 sch ...
- laravel源码解析
本专栏系列文章已经收录到 GitBooklaravel源码解析 Laravel Passport——OAuth2 API 认证系统源码解析(下)laravel源码解析 Laravel Passport ...
- Android 网络框架之Retrofit2使用详解及从源码中解析原理
就目前来说Retrofit2使用的已相当的广泛,那么我们先来了解下两个问题: 1 . 什么是Retrofit? Retrofit是针对于Android/Java的.基于okHttp的.一种轻量级且安全 ...
- DotNetty网络通信框架学习之源码分析
DotNetty网络通信框架学习之源码分析 有关DotNetty框架,网上的详细资料不是很多,有不多的几个博友做了简单的介绍,也没有做深入的探究,我也根据源码中提供的demo做一下记录,方便后期查阅. ...
- MyBatis 源码分析 - 缓存原理
1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...
- Tomcat源码分析——请求原理分析(上)
前言 谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多人早期的J2EE项目,由程 ...
- Laravel源码解析--看看Lumen到底比Laravel轻在哪里
在前面一篇<Laravel源码解析--Laravel生命周期详解>中我们利用xdebug详细了解了下Laravel一次请求中到底做了哪些处理.今天我们跟 Lumen 对比下,看看 Lume ...
- 从微信小程序开发者工具源码看实现原理(一)- - 小程序架构设计
使用微信小程序开发已经很长时间了,对小程序开发已经相当熟练了:但是作为一名对技术有追求的前端开发,仅仅熟练掌握小程序的开发感觉还是不够的,我们应该更进一步的去理解其背后实现的原理以及对应的考量,这可能 ...
- 一起学习vue源码 - Object的变化侦测
作者:小土豆biubiubiu 博客园:www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e894d 简书:h ...
随机推荐
- 【转载】malloc内存分配与free内存释放的原理
原文:http://www.cnblogs.com/huhuuu/p/3456662.html 前段时间一直想看malloc的原理,在搜了好几篇malloc源码后遂放弃,晦涩难懂. 后来室友买了本深入 ...
- 04 - django的路由层 1
1.路由控制简单配置 from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003 ...
- 【HNOI2014】米特运输
题面 题解 首先我们需要看懂题目 然后我们需要发现一个结论 只要有一个节点的权值确定,那么整棵树的权值就确定了 就像这样:(图片来源于网络,侵删) 然后我们根据这张图片,可以设\(f[i] = a[i ...
- 在eclipse中运行spring web application时的异常: java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderLis ...
- 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 ...
- Jenkins持续部署
Jenkins持续部署 Jenkins提供很好的连续部署和交付的支持.看一下部署任何软件开发的流程,将如下图所示. 连续部署的主要部分,是确保其上面所示的整个过程是自动化的.Jenkins实现所有这些 ...
- WebGL之sprite精灵效果显式数字贴图
接着前一篇<WebGL实现sprite精灵效果的GUI控件>,我们继续开发我们的数字系统GUI控件,因为这套数字系统是基于sprite效果的,所以数字随相机转动而旋转(永远面对相机),随场 ...
- python属性访问
1.python属性访问魔法方法: >>> class C: def __getattribute__(self,name): print("getattribute&qu ...
- linux shell 完成批量压缩文件
首先得到文件列表 使用 list -1 注意是1 不是l 然后是用一个循环内包装zip代码 #!/bin/bash list=`` for var in $list do echo $var zip ...
- elementUI实现前端分页
按照他的文档来写分页,最主要的是el-table里面展示的数据怎么处理 <el-table :data="AllCommodityList.slice((currentPage-1)* ...