Я просто не могу расширить класс 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 — единственный вариант.

0

Решение

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

            $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;
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]