Я просто не могу расширить класс Symfony2. Перепробовал все

Я буквально перепробовал все, чтобы попытаться расширить класс Symfony2 Form.

Я хочу добавить новый метод в форму и вызвать его в контроллере:

$form = $this->createForm($this->get('my_form_service'), $entity);
$form->myNewMethod();

Поскольку класс Form не определен как сервис и создается в другом классе (FormBuilder, строка 221), я не вижу, что я могу сделать. Я не хочу взламывать ядро.

Я мог бы расширить класс контроллера, например, метод createForm() возвращает экземпляр объекта Form:

// Extend Controller and do something with Form before returning

public function createForm($type, $data = null, array $options = array())
{
    return $this->container->get('form.factory')->create($type, $data, $options);

На самом деле Как добавить новый метод в объект php на лету? показывает, как я мог бы сделать выше и таким образом добавить свой новый метод, но я понимаю, что вам нужно как минимум добавить __call в класс Form - что я не могу сделать - иначе добавленный метод не сможет использовать $ это (что мне нужно).

Мне нужно только добавить это, когда форма используется в контроллере. Мне это не нужно для какой-либо обработки CLI.

Любые идеи, как я могу добавить метод в класс Form, не взламывая ядро?

================================================== ==================

РЕДАКТИРОВАТЬ: Почему я это делаю?

Я хочу "молча провалить" отправку формы, если соблюдены определенные критерии. Я считаю, что лучший способ сделать это было бы сделать это в контроллере:

if ($form->isValid()) {
    if ($form->requiresSilentFail()) {
        // Silently fail
    } else {
        // As normal, add to DB etc.
    }
}

Я полагаю, я мог бы просто сделать что-то вроде этого:

if ($form->isValid()) {
    if ($this->get('check_my_form')->requiresSilentFail($form)) {
        // Silently fail
    } else {
        // As normal, add to DB etc.
    }
}

.... но мне нужно сначала выполнить немного дополнительной логики в Form::handleRequest(), поэтому я считаю, что расширение Form - единственный вариант.

1 ответ

Я не очень понимаю, почему вам нужно расширять класс формы просто на вашем контроллере / службе, где вы обрабатываете вызов формы, под которым проверяется ваш метод, см. Ниже:

            $form->handleRequest($request);
            if ($form->isValid()) {
              $this->get($apiResource->getResourceHandlerName())->update($resourceData);
              $response = new Response();
              $response->setStatusCode($statusCode);
              if ($this->isSuccessFullStatusCode($statusCode)) {
                $serializedObject = $this->getSerializer()->serialize($resourceData, 'json',$serializationContext);
                $response->setStatusCode($responseStatusCode);
                $response->setContent($serializedObject);
                return $response;
            }
        }
Другие вопросы по тегам