关于Luthier CI的中中间件

中间件 Middleware

内容 Contents

  1. 介绍 Introduction
  2. 中间值执行点 Middleware execution points
  3. 建立中间件 Create a middleware
  4. 分配中间值 Assign a middleware
    1. 全局中间件 Global Middleware
    2. 路由中间件 Route middleware
  5. 运行中间件 Run a middleware
    1. 中间件参数 Middleware parameters
    2. 外部中间件 External middleware

介绍 ( Introduction )

将中间件视为一组层,请求必须在您的应用程序中经过才能到达资源。php

例如,使用中间件,您能够验证用户是否已登陆并具备足够的权限来访问应用程序的某些部分,不然将其重定向到其余位置。app

实际上,中间件是控制器的扩展,由于框架的单例已经在此时构建,您可使用该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类。post

例:this

<?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版本开始,使用未实现 Luthier\MiddlewareInterface 接口的中间件类是DEPRECATED并将在下一版本中中止工做

为了在应用程序中分配中间件,必须同时使用类的名称和文件的名称。另外,请注意不要使用与框架中的其余资源相同的名称,例如控制器,模型,库等。spa

添加 Middleware 后缀
避免冲突的一种方法是将 Middleware后缀添加到中间件名称。
从命令行建立中间件
若是已激活Luthier CI的内置CLI工具,请使用该 luthier make middleware [name] 命令建立新的中间件

分配中间件 ( Assign a middleware )

您能够在应用程序的不一样上下文中分配中间件:命令行

全球中间件 ( Global middleware )

要在全局上下文中定义中间件,请使用如下语法:code

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());
    }
}
复制代码
相关文章
相关标签/搜索