是否可以将多个过滤器应用于 CodeIgniter 4 中的单个路由

3m1*_*nc3 1 php controller routes filter 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)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

访问过滤器.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)
    { 

    }
}
Run Code Online (Sandbox Code Playgroud)

过滤器.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/*']] 
    ];
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

hey*_*hil 5

您已经创建了 2 个过滤器,紧接着您必须创建两个alias过滤filtersFilter.php过滤器。

之后,您必须打开app/config/Feature.php文件并更改此内容:

public $multipleFilters = false;
Run Code Online (Sandbox Code Playgroud)

public $multipleFilters = true;
Run Code Online (Sandbox Code Playgroud)

之后,您转到app/config/routes.php文件,然后如果您创建单个路线,则

$routes->get('home', 'Dashboard::index', ['filter' => ['ProvideinfoFilter','AccessFilter']]);
Run Code Online (Sandbox Code Playgroud)

如果你想使用的group话:

$routes->group('msp', ['filter' => ['authGuard','AdminAuth']], function($routes){
    $routes->get('/', 'MSPController::msp');
    $routes->get('list_data', 'MSPController::list_data');
});
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请关注此Codeigniter 4 文档