【问题标题】:Is it possible to apply multiple filters to a single route in CodeIgniter 4是否可以将多个过滤器应用于 CodeIgniter 4 中的单个路由
【发布时间】:2020-11-12 01:54:24
【问题描述】:

我已经尝试了几种方法来实现这一点,但似乎都没有奏效, 似乎 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)
    {

    }
}

AccessFilter.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)
    { 

    }
}

Filters.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' =&gt; ['before' =&gt; ['user', 'user/*']]'provide_info' =&gt; ['before' =&gt; ['user', 'user/*']] 会应用任何一个过滤器,并且可以在输出中看到回显的字符串。但是像上面演示的那样同时使用它们并不适用于它们。

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

【问题讨论】:

  • 如果您希望多个过滤器一个接一个地运行,则不应在之前的过滤器中返回某些内容。 $account_data-&gt;is_logged_in()$account_data-&gt;no_info_redirect() 返回了什么?
  • @ViLar 都返回一个 CI 4 重定向对象

标签: php filter routes controller codeigniter-4


【解决方案1】:

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

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

一般来说,如果您希望它不停止脚本,请避免在过滤器中返回任何内容。

【讨论】:

  • 我意识到了这一点,不得不将第二个过滤器设置为后过滤器。
猜你喜欢
  • 2017-10-05
  • 2014-06-07
  • 2015-01-29
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多