使用 Codeigniter 3 可以使用“trim”作为验证规则。 Codeigniter 4 似乎不再可能了。 那么,如果用户在输入的开头或结尾留下空格,如何在验证之前修剪输入值?
$validation->setRule('username', 'Username', 'trim|required|min_length[3]');
我想使用自定义规则,但这些函数只能返回 true 或 false。他们无法修改输入。另一个解决方案是使用 php 修剪功能,但我不知道在哪里使用它。 感谢您的帮助!
我猜您正在直接验证帖子请求。对于您需要的内容,我将验证您修改后的数组,而不是直接发送请求。
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 函数中自行验证用户名并修剪它。
我也有同样的问题。对我来说,在任何验证之前修剪大多数 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']
];
$this->
来引用 request
。我会建议更改朋友的答案@monsoonjoe
public function before(RequestInterface $request, $arguments = null)
{
$trimmed_post = filter_var(request()->getPost(), \FILTER_CALLBACK, ['options' => 'trim']);
request()->setGlobal('post', $trimmed_post);
}
我会建议添加到朋友的答案@monsoonjoe
public function before(RequestInterface $request, $arguments = null)
{
if (! $request instanceof IncomingRequest) {
return;
}
... etc