首页 > 解决方案 > 是否可以将多个过滤器应用于 CodeIgniter 4 中的单个路由

问题描述

我已经尝试了几种方法来实现这一点,但似乎都不起作用,似乎 CodeIgniter 4 没有能力将多个过滤器应用于单个路由,目前这是我正在尝试的:

提供InfoFilter.php:

<?php namespace App\Filters;

use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;

class ProvideinfoFilter implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null)
    {
        echo "pinfo";
        $account_data  = new \App\Libraries\Account_Data; 

        return $account_data->no_info_redirect();
    } 

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {

    }
}

访问过滤器.php:

<?php namespace App\Filters;

use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;

class AccessFilter implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null)
    {
        $account_data = new \App\Libraries\Account_Data; 

        echo "accessf"; 
        if ($request->uri->getSegment(1) !== 'm' && $request->uri->getSegment(2) !== 'm' && !$request->getGet('token')) 
        {
            return $account_data->is_logged_in();
        }
    } 

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    { 

    }
}

过滤器.php:

<?php namespace Config;

use CodeIgniter\Config\BaseConfig;

class Filters extends BaseConfig
{ 
    public $aliases = [ 
        'toolbar'  => \CodeIgniter\Filters\DebugToolbar::class, 
        'accesscontrol' => \App\Filters\AccessFilter::class, 
        'provide_info'  => \App\Filters\ProvideinfoFilter::class
    ];
 
    public $globals = [
        'before' => [   
        ],
        'after'  => [
            'toolbar' 
        ],
    ];
 
    public $methods = [];
 
    public $filters = [  
            'provide_info' => ['before' => ['user', 'user/*']],
            'accesscontrol' => ['before' => ['user', 'user/*']] 
    ];
}

我添加了用于调试的 echo 语句

问题是,注释掉'accesscontrol' => ['before' => ['user', 'user/*']]'provide_info' => ['before' => ['user', 'user/*']]应用任何一个过滤器,并且可以在输出中看到回显的字符串。但是,让它们都像上面演示的那样并不适用于它们。

运行两个过滤器对我来说很重要,因为我想使用 $globals 数组为每个过滤器应用特定的豁免。

标签: phpfilterroutescontrollercodeigniter-4

解决方案


如果您在 before 过滤器中返回一个 Responce 实例,它将被发送回客户端并且脚本执行将停止。https://codeigniter.com/user_guide/incoming/filters.html#before-filters

那么你的第二个过滤器没有运行是正常的。

通常,如果您希望它不停止脚本,请避免在过滤器之前返回任何内容。


推荐阅读