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 数组为每个过滤器应用特定的豁免。
您已经创建了 2 个过滤器,紧接着您必须创建两个alias过滤filters器Filter.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 文档