Php symfony1条令表格提交-在何处注入逻辑

Php symfony1条令表格提交-在何处注入逻辑,php,forms,doctrine,symfony1,symfony-1.4,Php,Forms,Doctrine,Symfony1,Symfony 1.4,我有一个简单的表单,其中包含一个可以接受金钱的输入,即float。到目前为止,它只能接受格式良好的小数,例如12768.56。注入一些服务器端逻辑(这里没有javascript)的任务将截获输入值,如12768.56,将其替换为12768.56,并让symfony/doctor完成其工作。转换只是一个例子,我已经得到了我所需要的,但问题是-我应该把截取函数放在哪里?我想它应该在XxxForm.class.php中。但我不知道是哪种方法数据保存处理数据?我很确定这有一个特别的地方…我找到了sffo

我有一个简单的表单,其中包含一个可以接受金钱的输入,即float。到目前为止,它只能接受格式良好的小数,例如
12768.56
。注入一些服务器端逻辑(这里没有javascript)的任务将截获输入值,如
12768.56
,将其替换为
12768.56
,并让symfony/doctor完成其工作。转换只是一个例子,我已经得到了我所需要的,但问题是-我应该把截取函数放在哪里?我想它应该在XxxForm.class.php中。但我不知道是哪种方法<代码>数据保存<代码>处理数据?我很确定这有一个特别的地方…

我找到了
sfformdoctor
类的源代码:。这里有一个片段:

153   /**
154    * Processes cleaned up values with user defined methods.
155    *
156    * To process a value before it is used by the updateObject() method,
157    * you need to define an updateXXXColumn() method where XXX is the PHP name
158    * of the column.
159    *
160    * The method must return the processed value or false to remove the value
161    * from the array of cleaned up values.
162    *
163    * @see sfFormObject
164    */
165   public function processValues($values)
也就是说,我们应该在doctrine form类中实现
updatexxColumn()
方法。我就这样做了:

// lib/form/doctrine/XxxForm.class.php
+  protected function updateAmountColumn($value)
+  {
+    return Tools::processMoneyStrToFloat($value);
+  }

工作正常。

您应该将此类逻辑放入自定义验证器中:

class myValidatorMoney extends sfValidatorNumber {

  protected function doClean($value) {
    $clean = $this->processNumber($value); // your logic in this function
    if($clean === false) { // if not possible to process
      throw new sfValidatorError($this, 'invalid', array('value' => $value));
    }
    return parent::doClean($clean);
  }
}

通过这种方式,它可以更好地处理symfony表单,
updatexxcolumn()
可以处理有效的值,但对于无效的输入,您无能为力。

让验证器更改输入似乎很奇怪。Asaik验证器应返回true或false,说明输入是否有效。似乎违反了设计?输入必须在验证之前进行预处理,否则验证器无法验证。这是symfony的方式,加入预处理器和验证器。验证器不仅应该告诉输入是否有效,还应该告诉输入有什么问题,例如不够长、无效字符等。