Я буквально перепробовал все, чтобы попытаться расширить класс 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 — единственный вариант.
Я не очень понимаю, почему вам нужно расширять класс формы просто на вашем контроллере / службе, где вы обрабатываете вызов формы, под которым проверяется ваш метод, см. Ниже:
$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;
}
}
Других решений пока нет …