Este é o meu saveAction
código (para onde o formulário passa os dados)
public function saveAction()
{
$user = OBUser();
$form = $this->createForm(new OBUserType(), $user);
if ($this->request->getMethod() == 'POST')
{
$form->bindRequest($this->request);
if ($form->isValid())
return $this->redirect($this->generateUrl('success_page'));
else
return $this->redirect($this->generateUrl('registration_form'));
} else
return new Response();
}
Minha pergunta é: como faço para obter os erros se $form->isValid()
retorna false
?
error_bubbling
como verdadeiro em seu tipo de formulário, definindo explicitamente a opção para cada campo.$form->getErrors(true)
incluir erros em formulários filhosSymfony 2.3 / 2.4:
Esta função obtém todos os erros. Aqueles no formulário como "O token CSRF é inválido. Tente reenviar o formulário." bem como erros adicionais nos filhos do formulário que não apresentam erros de bolha.
Para obter todos os erros como uma string:
Symfony 2.5 / 3.0:
Documentos:
https://github.com/symfony/symfony/blob/master/UPGRADE-2.5.md#form https://github.com/symfony/symfony/blob/master/UPGRADE-3.0.md#form (em a parte inferior:
The method Form::getErrorsAsString() was removed
)fonte
$errors[$child->getName()] = $this->getErrorMessages($child);
estava lançando uma exceção, pois getErrorMessages estava faltando no componente Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller . Então eu o substituí por$form_errors[$child->getName()] = $child->getErrorsAsString();
$this->getErrorMessages()
e pensei que fosse chamado diretamente de um controlador e parte da API Symfony.Abaixo está a solução que funcionou para mim. Esta função está em um controlador e retornará um array estruturado de todas as mensagens de erro e o campo que as causou.
Symfony 2.0:
Symfony 2.1 e mais recente:
fonte
$this->getFormErrors
deve ser$this->getErrorMessages
na sua amostra em Symfony2.1Use o validador para obter os erros de uma entidade específica
Referência da API:
fonte
Para obter mensagens adequadas (traduzíveis), atualmente usando SF 2.6.3, aqui está minha função final (já que nenhuma das anteriores parece funcionar mais):
já que o método Form :: getErrors () agora retorna uma instância de FormErrorIterator , a menos que você altere o segundo argumento ($ flatten) para true . (Em seguida, ele retornará uma instância FormError e você terá que chamar o método getMessage () diretamente, sem o método current ():
)
A coisa mais importante é definir o primeiro argumento como verdadeiro para obter os erros. Deixar o segundo argumento ($ flatten) com seu valor padrão ( true ) retornará instâncias FormError , enquanto retornará instâncias FormErrorIterator quando definido como false.
fonte
Para minhas mensagens flash, fiquei feliz com
$form->getErrorsAsString()
Editar (de Benji_X80): Para uso em SF3
$form->getErrors(true, false);
fonte
This method should only be used to help debug a form.
( fonte )A função para symfony 2.1 e mais recente, sem qualquer função obsoleta:
fonte
IF
declaração? Por que é mutuamente exclusivo? Tanto quanto eu posso ver: o formulário pode ter seus próprios erros, assim como filhos.Mensagens de erro de formulário traduzido (Symfony2.1)
Tenho lutado muito para encontrar essas informações, então acho que definitivamente vale a pena adicionar uma nota sobre a tradução de erros de formulário.
@Icode4food
resposta retornará todos os erros de um formulário. No entanto, a matriz retornada não leva em consideração a pluralização ou a tradução da mensagem .Você pode modificar o loop foreach de
@Icode4food
resposta para ter uma combinação:Aqui está:
Esta resposta foi reunida a partir de 3 postagens diferentes:
fonte
Fatal Error: Call to undefined method Symfony\Component\Form\FormError::getMessagePluralization()
. Estou suspeitando que isso é apenas para Symfony 2.1?SYMFONY 3.X
Outros métodos SF 3.X fornecidos aqui não funcionaram para mim porque eu poderia enviar dados vazios ao formulário (mas eu tenho restrições NotNull / NotBlanck). Nesse caso, a string de erro seria assim:
O que não é muito útil. Então eu fiz isso:
Que retornaria isso:
fonte
Você também pode usar o serviço de validador para obter violações de restrição:
fonte
Mensagens de erro de formulário traduzido (Symfony2.3)
Minha versão para resolver o problema:
/src/Acme/MyBundle/Resources/config/services.yml
/src/Acme/MyBundle/Form/FormErrors.php
/src/Acme/MyBundle/Controller/DefaultController.php
No Symfony 2.5 você pode obter todos os erros de campos muito facilmente:
fonte
Para Symfony 3.2 e acima, use isso,
Use str_replace se quiser se livrar do irritante texto ' Error: ' em cada texto de descrição de erro.
fonte
Se você estiver usando validadores personalizados, o Symfony não retorna erros gerados por esses validadores em
$form->getErrors()
.$form->getErrorsAsString()
retornará todos os erros de que você precisa, mas sua saída infelizmente está formatada como uma string, não uma matriz.O método que você usa para obter todos os erros (independentemente de onde eles vieram), depende de qual versão do Symfony você está usando.
A maioria das soluções sugeridas envolve a criação de uma função recursiva que verifica todos os formulários filho e extrai os erros relevantes em um array. Symfony 2.3 não tem a
$form->hasChildren()
função, mas tem$form->all()
.Aqui está uma classe auxiliar para Symfony 2.3, que você pode usar para extrair todos os erros de qualquer formulário. (É baseado no código de um comentário de yapro em um tíquete de bug relacionado na conta github do Symfony.)
Código de chamada:
fonte
Com base na resposta de @Jay Seth, fiz uma versão da classe FormErrors especialmente para Formulários Ajax:
Uso (por exemplo, em sua ação):
Versão Symfony: 2.8.4
Resposta JSON de exemplo:
O objeto de erro contém o campo "chave", que é o id do elemento DOM de entrada, para que você possa preencher facilmente as mensagens de erro.
Se você tiver formulários filho dentro do pai, não se esqueça de adicionar a
cascade_validation
opção dentro do formulário paisetDefaults
.fonte
Para Symfony 2.1 em diante para uso com exibição de erro Twig eu alterei a função para adicionar um FormError ao invés de simplesmente recuperá-los, desta forma você tem mais controle sobre os erros e não precisa usar error_bubbling em cada entrada individual. Se você não definir da maneira abaixo {{form_errors (form)}} permanecerá em branco:
fonte
$ form-> getErrors () funciona para mim.
fonte
Eu vim com esta solução. Ele funciona bem com o Symfony 2.4 mais recente .
Vou tentar dar algumas explicações.
Usando um validador separado
Acho uma má ideia usar validação separada para validar entidades e retornar mensagens de violação de restrição, como sugerido por outros escritores.
Você precisará validar manualmente todas as entidades, especificar grupos de validação, etc., etc. Com formas hierárquicas complexas, não é nada prático e sairá do controle rapidamente.
Desta forma, você validará o formulário duas vezes: uma com o formulário e outra com o validador separado. Esta é uma má ideia do ponto de vista do desempenho.
Eu sugiro iterar recursivamente o tipo de formulário com seus filhos para coletar mensagens de erro.
Usando alguns métodos sugeridos com declaração IF exclusiva
Algumas respostas sugeridas por outros autores contêm declarações IF mutuamente exclusivas como esta:
if ($form->count() > 0)
ouif ($form->hasChildren())
.Pelo que posso ver, todos os formulários podem conter erros, assim como filhos. Não sou especialista com o componente Symfony Forms , mas na prática você não obterá alguns erros do formulário em si, como erro de proteção CSRF ou erro de campos extras . Eu sugiro remover essa separação.
Usando estrutura de resultado desnormalizada
Alguns autores sugerem colocar todos os erros dentro de um array simples. Assim, todas as mensagens de erro do próprio formulário e de seus filhos serão adicionadas ao mesmo array com diferentes estratégias de indexação: baseadas em números para os próprios erros do tipo e baseadas em nomes para erros filhos. Eu sugiro usar a estrutura de dados normalizada do formulário:
Dessa forma, o resultado pode ser facilmente iterado posteriormente.
Minha solução
Então aqui está minha solução para este problema:
Espero que ajude alguém.
fonte
SYMFONY 3.1
Simplesmente implementei um método estático para lidar com a exibição de erros
Esperando ajudar
fonte
Symfony 3 e mais recente
Recentemente, criei uma função que cria uma árvore de erros de formulário. Isso será útil para retornar a lista de erros ao front-end. Isso se baseia em tipos de formulário com:
Código:
Resultado:
Aviso : eu sei que os erros de campos de nível mais profundo podem ser substituídos se o nível mais alto tiver erros, mas isso é propositalmente para o meu uso.
fonte
Para Symfony 2.1:
Esta é minha solução final juntando muitas outras soluções:
fonte