在我的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函数。
你能否建议我解决这个问题?
TNX!
答案 0 :(得分:1)
模板不会覆盖Doctrine_Record方法,它们只是在找不到本机方法时通过PHP magic __call
方法调用的回退。
为此,您需要在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'));
}
这是从previous answer to a similar question复制/粘贴的。您还必须重建模型。