在 Codeigniter 4 中验证表单输入之前修剪函数

问题描述 投票:0回答:4

使用 Codeigniter 3 可以使用“trim”作为验证规则。 Codeigniter 4 似乎不再可能了。 那么,如果用户在输入的开头或结尾留下空格,如何在验证之前修剪输入值?

$validation->setRule('username', 'Username', 'trim|required|min_length[3]');

我想使用自定义规则,但这些函数只能返回 true 或 false。他们无法修改输入。另一个解决方案是使用 php 修剪功能,但我不知道在哪里使用它。 感谢您的帮助!

forms validation input trim codeigniter-4
4个回答
2
投票

我猜您正在直接验证帖子请求。对于您需要的内容,我将验证您修改后的数组,而不是直接发送请求。

codeigniter 4 验证的一大优点是您实际上可以验证任何内容。与 codeigniter 3 不同,您只能使用它来验证 $_POST 数据。

假设您有两个字段,用户名和密码,并且想要修剪用户名。

在您将获取发布日期的控制器中,您将执行以下操作。

$validation =  \Config\Services::validation();
$validation->setRules([
   'username' => 'required',
   'password' => 'required|min_length[10]'
]);

$data = $this->request->getPost();
$data['username'] = trim($data['username']);

if (!$validation->run($data)) {
    // handle validation errors
}

如果您在模型中进行验证,我不确定验证是否在回调之前运行,但值得一试。因此,您可以在 beforeInsert 回调中定义一个函数并在那里处理修剪。

有关回调的更多信息请参见此处:

https://codeigniter.com/user_guide/models/model.html#specifying-callbacks-to-run

如果这不起作用,您甚至可以从模型中的验证规则中删除用户名,然后在 beforeFind 和 beforeUpdate 函数中自行验证用户名并修剪它。


1
投票

我也有同样的问题。对我来说,在任何验证之前修剪大多数 POST 变量是有意义的。即使是一些常见的验证规则也最好使用已修剪的值来执行。 正如 @micthi 所说,CodeIgniter 3 提供了一种在验证之前进行修剪的简单方法。 CodeIgniter 4 让它变得不那么简单。自定义验证规则无法为我们修改数据,并且模型事件方法(例如

beforeInsert

beforeUpdate
)也无法帮助我们运行回调,因为它们都在
after
验证后执行。 下面是 CodeIgniter 4 解决方案,可以在

任何验证之前

修剪 POST 变量。简而言之,创建一个filter,然后将其配置为在为任何POST方法执行任何控制器代码之前运行。它循环通过 $request 对象来修剪 POST 变量,如果 $request

 继续到控制器,则 
then 允许新修剪的版本。
创建:
app/Filters/TrimFilter.php

namespace App\Filters; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; use CodeIgniter\Filters\FilterInterface; class TrimFilter implements FilterInterface { public function before(RequestInterface $request, $arguments = null) { $trimmed_post = []; foreach($request->getPost() as $var => $val) { $trimmed_post[$var] = trim($val); } $request->setGlobal('post', $trimmed_post); } }

修改:
app/Config/Filters.php

// Add to the use statements use App\Filters\TrimFilter; // Add to the $aliases array public $aliases = [ 'trim' => TrimFilter::class ]; // Add to the $methods array public $methods = [ 'post' => ['trim'] ];

另一个选项:您可以在 BaseController.php 文件中执行修剪循环,而不是使用过滤器方法。在这种情况下,请记住在 BaseController 中使用
$this->
来引用

request


我会建议更改朋友的答案@monsoonjoe

0
投票
public function before(RequestInterface $request, $arguments = null) { $trimmed_post = filter_var(request()->getPost(), \FILTER_CALLBACK, ['options' => 'trim']); request()->setGlobal('post', $trimmed_post); }

我会建议添加到朋友的答案@monsoonjoe

0
投票
public function before(RequestInterface $request, $arguments = null) { if (! $request instanceof IncomingRequest) { return; } ... etc


© www.soinside.com 2019 - 2024. All rights reserved.