中间件 Middleware
内容 Contents
- 介绍 Introduction
- 中间值执行点 Middleware execution points
- 创建中间件 Create a middleware
-
分配中间值 Assign a middleware
- 全局中间件 Global Middleware
- 路由中间件 Route middleware
-
运行中间件 Run a middleware
- 中间件参数 Middleware parameters
- 外部中间件 External middleware
介绍 (Introduction)
将中间件视为一组层,请求必须在您的应用程序中通过才能到达资源。
例如,使用中间件,您可以验证用户是否已登录并具有足够的权限来访问应用程序的某些部分,否则将其重定向到其他位置。
实际上,中间件是控制器的扩展,因为框架的单例已经在此时构建,您可以使用该 ci()函数来获取它。
中间件执行点 (Middleware execution points)
有两个执行点:
-
pre_controller
: 此时定义的中间件将在控制器构造函数之后执行,但在执行任何控制器操作之前执行。 -
post_controller
: 此时定义的中间件将完全在 post_controllerCodeIgniter 的本机钩子上运行。
控制器构造函数始终首先执行
这是 CodeIgniter 的行为,而 Luthier CI 不会对其进行修改。
在某些时候您可能需要在中间件之前执行代码,这样做的方法是在控制器中定义一个名为的公共方法 preMiddleware:
<?php
# application/controllers/TestController.php
defined('BASEPATH') OR exit('No direct script access allowed');
class TestController extends CI_Controller
{public function preMiddleware()
{// This will be executed after the constructor (if it exists), but before the middleware
}
}
作为路由在回调中不可用
当您使用回调作为路由时,无法在中间件之前执行任意代码
创建一个中间件 (Create a middleware)
所有中间件必须保存在 application/middleware 文件夹中。中间件是任何带有 run()公共方法的 PHP 类。
例:
<?php
# application/middleware/TestMiddleware.php
class TestMiddleware implements Luthier\MiddlewareInterface
{public function run()
{// This is the entry point of the middleware}
}
实现 MiddlewareInterface
接口将是强制性的
从 0.3.0 版本开始,使用未实现 LuthierMiddlewareInterface
接口的中间件类是 DEPRECATED 并将在下一版本中停止工作
为了在应用程序中分配中间件,必须同时使用类的名称和文件的名称。另外,请注意不要使用与框架中的其他资源相同的名称,例如控制器,模型,库等。
添加 Middleware 后缀
避免冲突的一种方法是将 Middleware后缀添加到中间件名称。
从命令行创建中间件
如果已激活 Luthier CI 的内置 CLI 工具,请使用该luthier make middleware [name]
命令创建新的中间件
分配中间件 (Assign a middleware)
您可以在应用程序的不同上下文中分配中间件:
全球中间件 (Global middleware)
要在全局上下文中定义中间件,请使用以下语法:
Route::middleware([name], [exec_point?]);
name
i 中间件的名称在哪里,exec_point
是执行点,默认情况下是 pre_controller
.
您可以使用匿名函数而不是中间件的名称:
Route::middleware(function(){ci()->load->view('global_header');
});
路由中间件 (Route middleware)
在 route group 上下文中,中间件是另一个属性,因此它位于方法的第三个参数中 group()
:
Route::group('site', ['middleware' => ['AuthMiddleware']], function(){});
最后,在 individual route 上下文中,中间件也是另一个属性,因此它在第二个参数中
Route::put('foo/bar','controller@method', ['middleware' => ['TestMiddleware']]);
仅在 pre_controller 点将
中间件分配给路由和路由组时,执行点始终为 pre_controller
运行中间件 (Run a middleware)
要从控制器运行中间件,请使用属性的run()
方法 middleware
:
<?php
# application/controllers/TestController.php
defined('BASEPATH') OR exit('No direct script access allowed');
class TestController extends CI_Controller
{public function __construct()
{$this->middleware->run('AuthMiddleware');
}
}
中间件参数 (Middleware parameters)
该属性的 run()
方法 middleware
支持带有中间件参数的第二个参数:
// $args can be any variable type:
$args = ['foo' => 'bar'];
$this->middleware->run('AuthMiddleware', $args);
外部中间件 (External middleware)
只要它有一个名为的公共方法,就可以从外部类运行中间件 run()
<?php
# application/controllers/TestController.php
defined('BASEPATH') OR exit('No direct script access allowed');
use Vendor\CustomMiddleware;
class TestController extends CI_Controller
{public function __construct()
{$this->middleware->run(new CustomMiddleware());
}
}