Lumen开发:lumen源码解读之初始化(3)——单例(singleton)与中间件(Middleware)
版权声明:本文为博主原创文章,未经博主允许不得转载。
今天来讲讲Lumen的singleton和Middleware,先来看看起始文件bootstrap/app.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | / * | -------------------------------------------------------------------------- |登记容器绑定 | -------------------------------------------------------------------------- | |现在我们将登记在服务容器几绑定。我们将 |登记异常处理程序和控制台的内核。您可以添加 |自己绑定在这里如果你喜欢或者你可以做一个文件。 | * / $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接口时,比如
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** * 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来处理
如果
1 2 3 4 5 6 7 8 | /* $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来处理了。
顺便讲一下另一种单例注册
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /** * 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不是类,而是闭包了,会直接绑定。
(注:如果不是传闭包的话,会对每个绑定的类都包一层闭包,只有服务容器解析时运行,实现了懒加载)。
接下来是中间件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | / * | -------------------------------------------------------------------------- |登记中间件 | -------------------------------------------------------------------------- | |接下来,我们将与申请登记的中间件。这些可以 |全球中间件运行的每一个请求之前和之后的成 |路线或中间件,会被分配到一些特定的路线。 | * / $app ->middleware([ App\Http\Middleware\ExampleMiddleware:: class ]); $app ->routeMiddleware([ //'auth' => App\Http\Middleware\Authenticate::class, 'auth' => App\Http\Middleware\AuthUser:: class ]); |
1 | $app ->middleware()创建的中间件每次请求都会先过一遍,可以在里面做一些请求验证 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 ); } } |
1 | $app ->routeMiddleware(),是指定路由会过的中间件,这里我把路由用户验证中间件改了位置 |
1 2 3 | $app ->group([ 'middleware' => 'auth' ], function ( $app ){ $app ->get( 'user/data' , 'UserController@UserData' ); } |
访问http;//.../user/data或指定路由,会先过App\Http\Middleware\AuthUser
AuthUser.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <?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 '请登录!' ; }<br><br> //这里可以写一些对应的认证 return $next ( $request ); } } |
多用户就多添加绑定几个中间件即可,如AuthAdmin.php ...
Lumen技术交流群:310493206
版权声明:本文为博主原创文章,未经博主允许不得转载。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!