将中间件视为一组层,请求必须在您的应用程序中经过才能到达资源。php
例如,使用中间件,您能够验证用户是否已登陆并具备足够的权限来访问应用程序的某些部分,不然将其重定向到其余位置。app
实际上,中间件是控制器的扩展,由于框架的单例已经在此时构建,您可使用该ci()函数来获取它。框架
有两个执行点:函数
pre_controller
: 此时定义的中间件将在控制器构造函数以后执行,但在执行任何控制器操做以前执行。post_controller
: 此时定义的中间件将彻底在post_controllerCodeIgniter 的本机钩子上运行。在某些时候您可能须要在中间件以前执行代码,这样作的方法是在控制器中定义一个名为的公共方法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
}
}
复制代码
全部中间件必须保存在application/middleware文件夹中。中间件是任何带有run()公共方法的PHP类。post
例:this
<?php
# application/middleware/TestMiddleware.php
class TestMiddleware implements Luthier\MiddlewareInterface {
public function run() {
// This is the entry point of the middleware
}
}
复制代码
MiddlewareInterface
接口将是强制性的
Luthier\MiddlewareInterface
接口的中间件类是DEPRECATED并将在下一版本中中止工做
为了在应用程序中分配中间件,必须同时使用类的名称和文件的名称。另外,请注意不要使用与框架中的其余资源相同的名称,例如控制器,模型,库等。spa
luthier make middleware [name]
命令建立新的中间件
您能够在应用程序的不一样上下文中分配中间件:命令行
要在全局上下文中定义中间件,请使用如下语法:code
Route::middleware([name], [exec_point?]);
复制代码
name
i中间件的名称在哪里, exec_point
是执行点,默认状况下是 pre_controller
.
您可使用匿名函数而不是中间件的名称:
Route::middleware(function(){
ci()->load->view('global_header');
});
复制代码
在route group上下文中,中间件是另外一个属性,所以它位于方法的第三个参数中 group()
:
Route::group('site', ['middleware' => ['AuthMiddleware']], function(){
});
复制代码
最后,在 individual route 上下文中,中间件也是另外一个属性,所以它在第二个参数中
Route::put('foo/bar','controller@method', ['middleware' => ['TestMiddleware']]);
复制代码
pre_controller
要从控制器运行中间件,请使用属性的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');
}
}
复制代码
该属性的 run()
方法 middleware
支持带有中间件参数的第二个参数:
// $args can be any variable type:
$args = ['foo' => 'bar'];
$this->middleware->run('AuthMiddleware', $args);
复制代码
只要它有一个名为的公共方法,就能够从外部类运行中间件 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());
}
}
复制代码