php - 是否可以将多个过滤器应用于 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 数组为每个过滤器应用特定的豁免。
解决方案
如果您在 before 过滤器中返回一个 Responce 实例,它将被发送回客户端并且脚本执行将停止。https://codeigniter.com/user_guide/incoming/filters.html#before-filters
那么你的第二个过滤器没有运行是正常的。
通常,如果您希望它不停止脚本,请避免在过滤器之前返回任何内容。
推荐阅读
- apache-spark - 任务如何在 spark 引擎(称为 DAG)中执行?
- python - Python 中的文件处理 - Float > Str 错误
- sql-server - 具有日期范围和最大值函数的 SQL Server 查询
- python - 检测使用 async def 创建的任何函数
- python - 为没有名称的数据框列命名
- javascript - 回调值返回未定义
- sql - 在 SQL 存储过程中将 datetime 转换为 varchar
- r - 使用 awk、sed 或 R 基于字符串模式对所有行条目进行复杂提取
- android - 如何在 MaterialButton 中的文本右侧添加可绘制对象?
- javascript - 使用 Google API 获取两个位置之间的距离。PHP