CakePHP 3-如何在验证之前使用Trim()?

CakePHP 3-如何在验证之前使用Trim()?,php,validation,cakephp,cakephp-3.0,Php,Validation,Cakephp,Cakephp 3.0,我的表单验证空字段,但如果用户使用“空格”,验证将处理一个字符的方式。。如何在模型表中使用Trim(),使其不会发生 您可以在验证数据之前使用callback和trim()。您可以在验证数据之前使用callback和trim()。我一般喜欢为所有请求修剪数据。 这表明添加的无意义空格不会使验证失效: public function startup(Event $event) { // Data preparation if (!empty($this->Controller

我的表单验证空字段,但如果用户使用“空格”,验证将处理一个字符的方式。。如何在模型表中使用Trim(),使其不会发生

您可以在验证数据之前使用callback和trim()。

您可以在验证数据之前使用callback和trim()。

我一般喜欢为所有请求修剪数据。 这表明添加的无意义空格不会使验证失效:

public function startup(Event $event) {
    // Data preparation
    if (!empty($this->Controller->request->data) && !Configure::read('DataPreparation.notrim')) {
        $this->Controller->request->data = $this->trimDeep($this->Controller->request->data);
    }
    if (!empty($this->Controller->request->query) && !Configure::read('DataPreparation.notrim')) {
        $this->Controller->request->query = $this->trimDeep($this->Controller->request->query);
    }
    if (!empty($this->Controller->request->params['pass']) && !Configure::read('DataPreparation.notrim')) {
        $this->Controller->request->params['pass'] = $this->trimDeep($this->Controller->request->params['pass']);
    }
因此,在控制器或模型层的任何地方使用数据之前,可以使用这样的组件挂钩来清理数据

资料来源2.x:


Source 3.x:

我一般喜欢为所有请求修剪数据。 这表明添加的无意义空格不会使验证失效:

public function startup(Event $event) {
    // Data preparation
    if (!empty($this->Controller->request->data) && !Configure::read('DataPreparation.notrim')) {
        $this->Controller->request->data = $this->trimDeep($this->Controller->request->data);
    }
    if (!empty($this->Controller->request->query) && !Configure::read('DataPreparation.notrim')) {
        $this->Controller->request->query = $this->trimDeep($this->Controller->request->query);
    }
    if (!empty($this->Controller->request->params['pass']) && !Configure::read('DataPreparation.notrim')) {
        $this->Controller->request->params['pass'] = $this->trimDeep($this->Controller->request->params['pass']);
    }
因此,在控制器或模型层的任何地方使用数据之前,可以使用这样的组件挂钩来清理数据

资料来源2.x:

Source 3.x:

在验证数据之前,您可以使用callback和trim()

编辑: 一个简单的例子:

public function beforeRules($event, $entity, $options, $operation){
    $entity->set ('yourFieldname', trim ($entity->get ('yourFieldname')));
    return parent:: beforeRules($event, $entity, $options, $operation);
将其放入table类。

在验证数据之前,可以使用callback和trim()

编辑: 一个简单的例子:

public function beforeRules($event, $entity, $options, $operation){
    $entity->set ('yourFieldname', trim ($entity->get ('yourFieldname')));
    return parent:: beforeRules($event, $entity, $options, $operation);

将其放在table类中。

假设Posts表中有一个标题列,并且希望在验证之前修剪标题

将以下代码放入src\Model\Table\PostsTable.php

public function beforeMarshal(Event $event, ArrayObject $data)
    {
        $data['title'] = trim($data['title']);
    }
use Cake\Event\Event;
use ArrayObject;
并在src\Model\Table\PostsTable.php顶部添加以下两行

public function beforeMarshal(Event $event, ArrayObject $data)
    {
        $data['title'] = trim($data['title']);
    }
use Cake\Event\Event;
use ArrayObject;

谢谢

假设您在Posts表中有一个title列,并且您想在验证之前修剪title

将以下代码放入src\Model\Table\PostsTable.php

public function beforeMarshal(Event $event, ArrayObject $data)
    {
        $data['title'] = trim($data['title']);
    }
use Cake\Event\Event;
use ArrayObject;
并在src\Model\Table\PostsTable.php顶部添加以下两行

public function beforeMarshal(Event $event, ArrayObject $data)
    {
        $data['title'] = trim($data['title']);
    }
use Cake\Event\Event;
use ArrayObject;

谢谢

如果要修剪每条记录,您需要在每个模型中添加
之前封送

这是工作代码

// Include use statements at the top of your file.
use Cake\Event\Event;
use ArrayObject;

// In a table or behavior class
public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)
{
    foreach ($data as $key => $value) {
        if (is_string($value)) {
            $data[$key] = trim($value);
        }
    }
}
这是cakephp的官方参考资料

如果要修剪每条记录,则需要在每个模型中添加
,然后进行封送处理

这是工作代码

// Include use statements at the top of your file.
use Cake\Event\Event;
use ArrayObject;

// In a table or behavior class
public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)
{
    foreach ($data as $key => $value) {
        if (is_string($value)) {
            $data[$key] = trim($value);
        }
    }
}
这是cakephp的官方参考资料

这是为cakephp 2.x设计的,是否将用于制作蛋糕3?我还没有阅读所有内容,但我必须为我要验证的每个模型创建一个组件?您应该能够自己在同一个repo中找到相应的Cake3分支。这是针对cakephp 2.x的,将用于Cake3?我还没有全部阅读,但我必须为我要验证的每个模型创建一个组件?您应该能够自己在同一回购协议中找到相应的Cake3分支..对不起,但您能给我一个使用beforeRules的示例吗?对不起,但你能给我一个使用beforeRules的例子吗?很抱歉,我刚刚在智能手机上编辑了我的帖子,这是一个新的答案?不明白我做错了什么吗?
beforeRules
发生在应用验证规则之后,以及应用表规则之前。很抱歉,我刚刚在智能手机上编辑了我的帖子,这是一个新的答案?不明白我做错了什么吗?
beforeRules
发生在应用验证规则之后,以及应用表规则之前。您可能需要注意的是,您是否检查过,当您仅使用BeforeMarshall方法时,是否将空格保存在数据库中?我也尝试过这个解决方案,但实体本身仍然包含空格。当触发另一个错误时,我看到了这一点。因此,我认为要确实删除空格,必须调用
$this->request->data['fieldname']=trim($this->request->data['fieldname'])代码。也许我错了,但是如果您输入空格字符“abc”,当表单再次显示并显示错误消息时,这将不会删除空格?否,我尝试过,前导空格被修剪并保存。您是否检查过,当您仅使用beforeMarshal方法时,是否将空格保存在数据库中?我也尝试过这个解决方案,但实体本身仍然包含空格。当触发另一个错误时,我看到了这一点。因此,我认为要确实删除空格,必须调用
$this->request->data['fieldname']=trim($this->request->data['fieldname'])代码。也许我错了,但是如果您输入空格字符“abc”,当表单再次显示并显示错误消息时,这不会删除空格?不,我尝试过,前导空格已被修剪并保存。