1

在我的 Symfony 项目中,我将使用一种新策略来管理数据表单。

我不想使用 Symfony Form 对象,但我想使用模型来构建它们。

我不想重新声明 Base Doctrine_Record 类,所以我写了一个新的 Doctrine_Template:ExtendedModel。

在 ExtendeModel 模板中,我有新的对象和方法,但我需要重写 Doctrine_Record 的 validate() 函数。

我试过了

class ExtendedModel extends Doctrine_Template {

[...]

public $validatorSchema;

public function setValidatorSchema(sfValidatorSchema $validatorSchema) {
    $this->validatorSchema = $validatorSchema;
}

public function getValidatorSchema() {
    return $this->validatorSchema;
}

public function validate() {
    $this->getInvoker()->setup();

    $errorStack = $this->getInvoker()->getErrorStack();
    if ($this->getValidatorSchema()) {
        try {
            $this->getValidatorSchema()->addOption('allow_extra_fields', true);
            $this->getValidatorSchema()->clean($this->getInvoker()->toArray(false));
        } catch (sfValidatorErrorSchema $errorSchema) {
            $errorStack = $this->getInvoker()->getErrorStack();
            foreach ($errorSchema->getErrors() as $key => $error) {
                /* @var $error sfValidatorError  */
                $errorStack->add($key, $error->getMessage());
            }
        }
    }
    $this->getInvoker()->validate();
}

}

但是 Doctrine 使用原始的 validate() 函数。

我想用在我的 Doctrine_Template 中声明的新方法来覆盖一些 Doctrine_Record 函数。

你能建议我解决这个问题吗?

天呐!

4

1 回答 1

1

模板不会覆盖 Doctrine_Record 方法,它们只是__call在找不到本地方法时通过 PHP 魔术方法调用的后备。

为此,您需要在 Doctrine_Record 继承链中拥有自己的类。幸运的是,这很容易:

1. 创建 myDoctrineRecord

abstract class myDoctrineRecord extends sfDoctrineRecord
{
   public function commonRecordMethod() { }
}

我将此文件放在 lib/record 中,但您可以将其放在自动加载器可以看到的任何位置。

2. 将 Symfony 设置为在 ProjectConfiguration 的 configureDoctrine 回调中使用此类:

public function configureDoctrine(Doctrine_Manager $manager)
{
   sfConfig::set('doctrine_model_builder_options', array('baseClassName' => 'myDoctrineRecord'));
}

这是从我之前对类似问题的回答中复制/粘贴的。您还必须重建模型。

于 2010-12-21T14:37:03.593 回答