是否可以将多个过滤器应用于 CodeIgniter 4 中的单个路由
Is it possible to apply multiple filters to a single route in CodeIgniter 4
我已经尝试了几种方法来实现这一点,但是 none 似乎可行,
CodeIgniter 4 似乎无法将多个过滤器应用于单个路由,目前我正在尝试这样做:
ProvideInfoFilter.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' => ['before' => ['user', 'user/*']]
或 'provide_info' => ['before' => ['user', 'user/*']]
会应用任一过滤器,并且可以在输出中看到回显的字符串。但是像上面演示的那样同时拥有它们并不适用于它们。
拥有两个过滤器对我来说很重要 运行,因为我想使用 $globals 数组为每个过滤器应用特定的豁免。
如果您 return 之前过滤器中的 Responce 实例,它将被发送回客户端并且脚本执行将停止。 https://codeigniter.com/user_guide/incoming/filters.html#before-filters
第二个过滤器没有 运行 是正常的。
一般来说,如果您希望它不停止您的脚本,请避免 return 在前置过滤器中使用任何东西。
我已经尝试了几种方法来实现这一点,但是 none 似乎可行, CodeIgniter 4 似乎无法将多个过滤器应用于单个路由,目前我正在尝试这样做:
ProvideInfoFilter.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' => ['before' => ['user', 'user/*']]
或 'provide_info' => ['before' => ['user', 'user/*']]
会应用任一过滤器,并且可以在输出中看到回显的字符串。但是像上面演示的那样同时拥有它们并不适用于它们。
拥有两个过滤器对我来说很重要 运行,因为我想使用 $globals 数组为每个过滤器应用特定的豁免。
如果您 return 之前过滤器中的 Responce 实例,它将被发送回客户端并且脚本执行将停止。 https://codeigniter.com/user_guide/incoming/filters.html#before-filters
第二个过滤器没有 运行 是正常的。
一般来说,如果您希望它不停止您的脚本,请避免 return 在前置过滤器中使用任何东西。