Переопределить метод проверки Doctrine_Record с помощью Doctrine_Template - PullRequest
1 голос
/ 21 декабря 2010

В моем проекте Symfony я бы использовал новую стратегию для управления формой данных.

Я не хочу использовать объект формы Symfony, но я хочу использовать модель для их построения.

Я не хочу переопределять класс Base Doctrine_Record, поэтому я написал новый Doctrine_Template: ExtendedModel.

В шаблоне ExtendeModel есть новые объекты и методы, но мне нужно переопределить функцию validate () Doctrine_Record.

Я пытался с

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_Record новыми методами, объявленными в моем Doctrine_Template.

Не могли бы вы предложить мне решение этой проблемы?

Tnx!

1 Ответ

1 голос
/ 21 декабря 2010

Шаблоны не переопределяют методы Doctrine_Record, они являются только откатами, вызываемыми с помощью метода PHP magic __call, когда собственный метод не найден.

Для этого вам нужен собственный класс в цепочке наследования Doctrine_Record. К счастью, это довольно просто:

1. Создать myDoctrineRecord

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

Я помещаю этот файл в lib / record, но вы можете поместить его в любое место, где автозагрузчик его увидит.

2. Настройте Symfony на использование этого класса в обратном вызове configureDoctrine вашей ProjectConfiguration:

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

Это скопировано / вставлено из моего предыдущего ответа на аналогичный вопрос . Вам также нужно будет восстановить модель.

...