Lumen开发:lumen源码解读之初始化(3)——单例(singleton)与中间件(Middleware)
版权声明:本文为博主原创文章,未经博主允许不得转载。
今天来讲讲Lumen的singleton和Middleware,先来看看起始文件bootstrap/app.php
/ *
| --------------------------------------------------------------------------
|登记容器绑定
| --------------------------------------------------------------------------
|
|现在我们将登记在服务容器几绑定。我们将
|登记异常处理程序和控制台的内核。您可以添加
|自己绑定在这里如果你喜欢或者你可以做一个文件。
|
* /
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
App\Exceptions\Handler::class
); $app->singleton(
Illuminate\Contracts\Console\Kernel::class,
App\Console\Kernel::class
);
这部分是注册绑定了异常处理类和控制台内核类。好像Kernel在Lumen的重要性不如Laravel。
那我们先来分析异常处理的绑定吧,当访问到Illuminate\Contracts\Debug\ExceptionHandler::class接口时,比如
/**
* Get the exception handler from the container.(从容器中获取异常处理程序。)
*
* @return mixed
*/
protected function resolveExceptionHandler()
{
if ($this->bound('Illuminate\Contracts\Debug\ExceptionHandler')) {
return $this->make('Illuminate\Contracts\Debug\ExceptionHandler');
} else {
return $this->make('Laravel\Lumen\Exceptions\Handler');
}
}
会自动绑定到App\Exceptions\Handler::class来处理
如果
/* $app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
App\Exceptions\Handler::class
); */
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
Laravel\Lumen\Exceptions\Handler::class
);
就会由Illuminate\Contracts\Debug\ExceptionHandler::class来处理了。
顺便讲一下另一种单例注册
/**
* Register container bindings for the application.(为应用程序注册容器绑定。)
*
* @return void
*/
protected function registerDatabaseBindings()
{
$this->singleton('db', function () {
return $this->loadComponent(
'database', [
'Illuminate\Database\DatabaseServiceProvider',
'Illuminate\Pagination\PaginationServiceProvider',
], 'db'
);
});
}
这是前面讲数据库初始化时有提到的,这里有两点不一样的地方,第一个参数$abstract不是接口,而是别名‘db’,第二个参数$concrete不是类,而是闭包了,会直接绑定。
(注:如果不是传闭包的话,会对每个绑定的类都包一层闭包,只有服务容器解析时运行,实现了懒加载)。
接下来是中间件
/ *
| --------------------------------------------------------------------------
|登记中间件
| --------------------------------------------------------------------------
|
|接下来,我们将与申请登记的中间件。这些可以
|全球中间件运行的每一个请求之前和之后的成
|路线或中间件,会被分配到一些特定的路线。
|
* / $app->middleware([
App\Http\Middleware\ExampleMiddleware::class
]); $app->routeMiddleware([
//'auth' => App\Http\Middleware\Authenticate::class,
'auth' => App\Http\Middleware\AuthUser::class
]);
$app->middleware()创建的中间件每次请求都会先过一遍,可以在里面做一些请求验证
namespace App\Http\Middleware; use Closure; class ExampleMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->input('id') <= 10) {
//echo '$_GET["id"] is litter than 10';exit;
} return $next($request);
}
}
$app->routeMiddleware(),是指定路由会过的中间件,这里我把路由用户验证中间件改了位置
$app->group(['middleware' => 'auth'], function ($app){
$app->get('user/data','UserController@UserData');
}
访问http;//.../user/data或指定路由,会先过App\Http\Middleware\AuthUser
AuthUser.php
<?php namespace App\Http\Middleware; use Closure;
use Illuminate\Contracts\Auth\Factory as Auth; class AuthUser
{
/**
* The authentication guard factory instance.
*
* @var \Illuminate\Contracts\Auth\Factory
*/
protected $auth; /**
* Create a new middleware instance.
*
* @param \Illuminate\Contracts\Auth\Factory $auth
* @return void
*/
public function __construct(Auth $auth)
{
$this->auth = $auth;
} /**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{ $token = $request->input('token'); if(!$token){
echo '请登录!';
} //这里可以写一些对应的认证 return $next($request);
}
}
多用户就多添加绑定几个中间件即可,如AuthAdmin.php ...
Lumen技术交流群:310493206
版权声明:本文为博主原创文章,未经博主允许不得转载。
Lumen开发:lumen源码解读之初始化(3)——单例(singleton)与中间件(Middleware)的更多相关文章
- Lumen开发:lumen源码解读之初始化(4)——服务提供(ServiceProviders)与路由(Routes)
版权声明:本文为博主原创文章,未经博主允许不得转载. 前面讲了singleton和Middleware,现在来继续讲ServiceProviders和Routes,还是看起始文件bootstrap/a ...
- Lumen开发:lumen源码解读之初始化(2)——门面(Facades)与数据库(db)
版权声明:本文为博主原创文章,未经博主允许不得转载. 紧接上一篇 $app->withFacades();//为应用程序注册门面. $app->withEloquent();//为应用程序 ...
- mybatis源码解读(一)——初始化环境
本系列博客将对mybatis的源码进行解读,关于mybatis的使用教程,可以查看我前面写的博客——传送门. 为了便于后面的讲解,我们这里首先构造一个统一环境.也可以参考mybatis官网. 1.数据 ...
- Lumen开发:lumen源码解读之初始化(5)——注册(register)与启动(boot)
版权声明:本文为博主原创文章,未经博主允许不得转载. register()是在服务容器注册服务, bootstrap/app.php /** * 注册外部服务 */ $app->register ...
- Lumen开发:lumen源码解读之初始化(1)——app实例
版权声明:本文为博主原创文章,未经博主允许不得转载. 有些注释来着原文的百度翻译,可以有些难理解或者奇怪,我后面会根据自己的理解做调整的哈!!!不喜勿喷,层主英语不过关... 先来看看入口文件publ ...
- 李洪强iOS开发之宏定义方法来初始化一个单例对象
单例的使用: .m 为了方便实用,只要将以下代码定义在header文件或者.pch文件即可: // .h #define singleton_interface(class) + (instancet ...
- twisted 源码分析一:reactor 单例
一个twisted进程只会有一个reactor反应器,下面我们来看看twisted是怎样实现这个单例反应器的, 路径:twisted\internet\reactor.py 主要代码如下: impor ...
- Vue 源码解读(2)—— Vue 初始化过程
当学习成为了习惯,知识也就变成了常识. 感谢各位的 点赞.收藏和评论. 新视频和文章会第一时间在微信公众号发送,欢迎关注:李永宁lyn 文章已收录到 github 仓库 liyongning/blog ...
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
随机推荐
- 【Linux】CentOS7上的一些操作小方法
1.在文件夹目录下删除文件 点击文件,按Delete键删除,就可以把文件删除到回收站中. 2.更改命令窗口的样式 打开命令窗口--->右键---->配置文件---->配置文件首选项
- 理解ASP.NET 5 Web Apps
来源https://docs.asp.net/en/latest/conceptual-overview/understanding-aspnet5-apps.html ASP.NET 5引入了几个新 ...
- VBA 时间相关的函数
DateSerial DateADD Datediff http://www.yiibai.com/vba/vba_datediff_function.html https://www.techont ...
- SQL 存储过程(转帖摘录)
篇一: 创建存储过程 Create Proc dbo.存储过程名 存储过程参数 AS 执行语句 RETURN 执行存储过程 GO *********** ...
- eclipse自动添加作者、日期等注释
使用eclipse的时候一般会添加自己的注释,标注日期作者等内容,我总结的添加注释的方式有两种:一.在新建class时自动添加注释:二.通过快捷键自动添加注释.下面分别描述一下添加方式. 一.新建cl ...
- 使用终端shell命令批量改动一个文件下的全部文件的读写权限
之前对openfire安装的目录就遇到过这个问题,今天再次遇到.须要改动一个目录以下的全部子目录以及文件的三个权限:本用户读写.管理员读写.全部人读写,三个都要需改为wr 步骤例如以下:比如我要改动/ ...
- SQL SERVER 使用订阅发布同步数据库(转)
一.数据库复制涉及 1.发布服务器: 数据的来源服务器,维护源数据,决定哪些数据将被分发,检测哪些数据发生了修改,并将这些信息提交给分发服务器. 2.分发服务器: 分发服务器负责把从发布服务器拿 ...
- Java 二分法查找
算法:当数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的. 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功:若 x 小于 ...
- 【Java】各种软件安装与环境配置的失败
又来到了java的世界,看了一段时间的视频.感觉太空虚,便从网上找到一个教程.想做几个demo试试,少不了的前期准备:Java开发环境配置,Eclipse JSP/Servlet 环境搭建等. ...
- 控制器View是怎样创建的?
对于非常多程序猿来说控制器和View的关系肯定有点模糊,对于View的创建肯定有一种说不清道不明的感觉.view仅仅是控制器的一个属性.控制器中有很多对view处理的方法.也就是说得控制器管理view ...