Acessar valores POST no objeto de solicitação Symfony2


93

OK, esta é uma pergunta para novatos, mas não consigo encontrar a resposta em lugar nenhum. Em um controlador no Symfony2, desejo acessar o valor POST de um dos meus formulários. No controlador eu tenho:

public function indexAction()
{ 
    $request = $this->get('request');
    if ($request->getMethod() == 'POST') {
        $form = $this->get('form.factory')->create(new ContactType());
        $form->bindRequest($request);
        if ($form->isValid()) {
            $name_value = $request->request->get('name');

Infelizmente $name_valuenão está devolvendo nada. O que estou fazendo de errado? Obrigado!

Respostas:


99

Symfony 2.2

esta solução está obsoleta desde 2.3 e será removida em 3.0, consulte a documentação

$form->getData();

fornece uma matriz para os parâmetros do formulário

do livro symfony2, página 162 (Capítulo 12: Formulários)

[...] às vezes, você pode querer apenas usar um formulário sem classe e obter de volta um array dos dados enviados. Na verdade, isso é muito fácil:

public function contactAction(Request $request) {
  $defaultData = array('message' => 'Type your message here');
  $form = $this->createFormBuilder($defaultData)
  ->add('name', 'text')
  ->add('email', 'email')
  ->add('message', 'textarea')
  ->getForm();
  if ($request->getMethod() == 'POST') {
    $form->bindRequest($request);
    // data is an array with "name", "email", and "message" keys
    $data = $form->getData();
  }
  // ... render the form
}

Você também pode acessar os valores POST (neste caso, "nome") diretamente por meio do objeto de solicitação, assim:

$this->get('request')->request->get('name');

Esteja ciente, no entanto, que na maioria dos casos, usar o método getData () é uma escolha melhor, já que ele retorna os dados (geralmente um objeto) após terem sido transformados pela estrutura do formulário.

Quando você deseja acessar o token do formulário, você deve usar a resposta de Problemática $postData = $request->request->get('contact');porque getData()remove o elemento do array


Symfony 2.3

desde 2.3 você deve usar em handleRequestvez de bindRequest:

 $form->handleRequest($request);

veja a documentação


4
Isso é ótimo e agora é a melhor resposta. $ form-> getData () não existia ou não estava documentado quando fiz a pergunta.
Acyra

4
para vincular os dados do pedido ao formulário nas versões mais recentes, você deve usar $ form-> handleRequest ($ request); em vez de $ form-> submit ($ request); eu acho que. Mais detalhes symfony.com/doc/2.3/book/forms.html#handling-form-submissions
adridev

127

Os valores de postagem do formulário são armazenados com o nome do formulário na solicitação. Por exemplo, se você substituiu o getName()método de ContactType () para retornar "contato", faria o seguinte:

$postData = $request->request->get('contact');
$name_value = $postData['name'];

Se você ainda tiver problemas, tente fazer uma var_dump()em $request->request->all()ver todos os valores pós.


2
Obrigado. O var_dump ajudou, acabei atacando isso com um nome completo para recuperar os dados do formulário, por exemplo, $ postData = $ request-> request-> get ('acme_somebundle_contact_type')
Acyra

1
Veja a resposta de timaschew abaixo, já que isso foi perguntado, Symfony2 adicionou um novo método: $ form-> getData ();
Acyra

2
Se você substituiu o getName(), faz sentido não codificar os nomes:$request->request->get($form->getName());
meze

Obrigado .. Economizei muito do meu tempo :) Cheers !!
Anjana Silva

38

o que funcionou para mim foi usar isto:

$data = $request->request->all();
$name = $data['form']['name'];

Isso é o que a Problemática mencionou, + veja o comentário de @meze lá
phpsherpa 01 de

17

Existe um truque com o ParameterBag::get()método. Você pode definir $deepparâmetros para truee acesso o valor aninhada profunda necessário sem variável adicional:

$request->request->get('form[some][deep][data]', null, true);

Além disso, você tem a possibilidade de definir um valor padrão (2º parâmetro do get()método), pode evitar a isset($form['some']['deep']['data'])chamada redundante .


O terceiro parâmetro foi preterido e removido do 3.0. Observação: a localização de itens profundos foi preterido desde a versão 2.8, para ser removido na 3.0. : github.com/symfony/symfony/blob/…
AL

8

Os dados de campo podem ser acessados ​​em um controlador com: Listagem 12-34

$form->get('dueDate')->getData();

Além disso, os dados de um campo não mapeado também podem ser modificados diretamente: Listagem 12-35

$form->get('dueDate')->setData(new \DateTime());

página 164 livro symfony2 (gerado em 9 de outubro de 2013)


7

Eu acesso o parâmetro ticketNumber para minha solicitação de postagem multiparte da seguinte maneira.

$data = $request->request->all();
$ticketNumber = $data["ticketNumber"];

1

Acho que, para obter os dados da solicitação, vinculados e validados pelo objeto de formulário, você deve usar:

$form->getClientData();


7
getClientData está obsoleto. Use getData, getViewData, getNormData .... O componente Form é muito confuso no SF2 (eles realmente deveriam se inspirar no mundo Java e no legal RequestDataBinder ....)
Thomas Decaux

0

Doc Symfony para obter os dados do pedido

Finalmente, os dados brutos enviados com o corpo da solicitação podem ser acessados ​​usando getContent ():

$ content = $ request-> getContent ();


-14

Se você é um novato, bem-vindo ao Symfony2, um projeto de código aberto, então se você quiser aprender muito, pode abrir o código!

De "Form.php":

getData () getNormData () getViewData ()

Você pode encontrar mais detalhes neste arquivo.


Sempre use o jeito Symfony, $ _POST, $ request is dirty
Thomas Decaux

Sim, não sou bom para explicação ^^ mas esta é exatamente a mesma solução que a confirmada $form->getData();Eu sei que as pessoas são preguiçosas e querem uma solução sem pensar um pouco ;-(
Thomas Decaux
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.