Como obter os parâmetros de solicitação no symfony2


203

Eu sou muito novo no symfony. Em outros idiomas, como java e outros, posso usar request.getParameter('parmeter name')para obter o valor.

Existe algo semelhante que possamos fazer com o symfony2.
Eu já vi alguns exemplos, mas nenhum está funcionando para mim. Suponha que eu tenha um campo de formulário com o nome nome de usuário . Na ação de formulário, tentei usar algo como isto:

$request = $this->getRequest();
$username= $request->request->get('username'); 

Eu também tentei

$username = $request->getParameter('username');

e

$username=$request->request->getParameter('username');

No entanto, nenhuma das opções está funcionando.

foreach($request->request->all() as $req){
    print_r($req['username']);
}

Onde estou fazendo errado ao usar o getParameter()método Qualquer ajuda será apreciada.


Você tem um erro de digitação na linha dois: $request->request-get()deveria ser $request->request->get(). Poderia ser isso?
halfer

escrevi o mesmo no code.missed aqui. desculpe pelo erro de digitação aqui. ainda não está funcionando.
Abdul Hamid

Você (a) verificou o manual para garantir que este get()é o método correto e (b) ativou os avisos do PHP para ver se há algum problema? (c) O Symfony 2 possui uma barra de ferramentas de depuração como o symfony 1, para que você possa ver se cometeu algum erro?
halfer

Você está confundindo nome e nome de usuário?
greg0ire

Respostas:


416

A nomeação não é tão intuitiva:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    // $_GET parameters
    $request->query->get('name');

    // $_POST parameters
    $request->request->get('name');

46
É diferente do que o PHP usa, mas na verdade faz mais sentido. $_GETdata são dados da string de consulta (nenhuma GETsolicitação é necessária) e $_POSTdados são dados do corpo da solicitação (não precisa ser uma POSTsolicitação também, poderia ser PUT).
igorw

5
tentou $ request-> query-> get ('name'); mas também não está funcionando.
Abdul Hamid

7
Como obtenho os parâmetros de uma solicitação PUT?
Tjorriemorrie 9/09/13

10
Nomeação muito estranha aqui, certamente $request->gete $request->postseria mais simples.
precisa saber é

3
comentário de igorw traz clareza para esta convenção de nomenclatura louca
Dheeraj

32

Eu faço isso ainda mais simples:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    $foo = $request->get('foo');
    $bar = $request->get('bar');
}

Outra opção é introduzir seus parâmetros em sua definição de função de ação:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request, $foo, $bar)
{
    echo $foo;
    echo $bar;
}

que assume que você definiu {foo} e {bar} como parte do seu padrão de URL no seu arquivo routing.yml:

acme_myurl:
    pattern:  /acme/news/{foo}/{bar}
    defaults: { _controller: AcmeBundle:Default:getnews }

e no primeiro exemplo, se eu tiver um fooparâmetro na string de consulta e no corpo do POST, qual será retornado por $request->get('foo')?
precisa

1
Parece que a precedência é GET, PATH, POST api.symfony.com/master/Symfony/Component/HttpFoundation/…
Dimitry K

Esta é a melhor resposta #
21315 steampowered

7
Não, não é. A documentação do próprio método diz que é desencorajado usá-lo porque é mais pesado do que acessar os parâmetros GET / POST por meio de suas coleções específicas.
jurchiks

1
A resposta está correta $request->get('foo'); para TODAS as malas (a ordem é: CAMINHO, GET, POST). No entanto, $request->request->get('foo');funciona apenas para o saco POST. Finalmente, o primeiro ( $request->get()) não é recomendado se soubermos onde estão os dados (GET / POST).
F2000

18

Você pode usar o código a seguir para obter seus valores de campo de formulário

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    // retrieve GET and POST variables respectively
    $request->query->get('foo');
    $request->request->get('bar', 'default value if bar does not exist');
}

Ou Você também pode obter todos os valores de formulário como matriz usando

$request->request->all()

3
$ request-> request-> all () está funcionando para mim, mas algo como $ request-> query-> get ('foo'); não está funcionando.
Abdul Hamid

13

experimentar

$request->request->get('acme_demobundle_usertype')['username']

inspecione o nome do atributo do seu campo formular


1
+1, já que acho que, de todas as respostas, somente essa indica o que não é óbvio - nos casos em que você criou seus formulários automaticamente com a ajuda do construtor de formulários do symfony, o symfony renomeia o campo do formulário para algo mais do que você Espero. Like name = "acme_demobundle_userform [nome_do_campo]"
userfuser 23/04

A sintaxe que você mencionou aqui não está funcionando com o php 5.3.10. Qual é a versão mínima para suportar isso?
23814 Justina Lelys

2
@justinasLelys tenta $ userType = $ request-> request-> get ('acme_demobundle_usertype'); $ nome de usuário = $ nome de usuário ['nome de usuário'];
sono-er

@JustinasLelys Sintaxe é PHP 5.4
COil

"nome de usuário" não pode ser definido. Então é melhor verificar com "??" primeiro.
Viktor Sydorenko

9

Dentro de um controlador:

$request = $this->getRequest();
$username = $request->get('username');

6
Nas versões mais recentes do Symfony, $this->getRequest()é preterido, em favor de injetar o Pedido na ação do controlador, por exemplo:public function showAction(Request $request, $id);
Adam Elsodaney 4/14/14

9

Suas opções:

  1. Simples:
    • $request->request->get('param')( $_POST['param']) ou
    • $request->query->get('param')( $_GET['param'])
  2. Bons formulários Symfony com todas as validações, transormação de valor e renderização de formulários com erros e muitos outros recursos:
  3. Algo intermediário (veja o exemplo abaixo)
<?php
/**
 * @Route("/customers", name="customers")
 *
 * @param Request $request
 * @return Response
 */
public function index(Request $request)
{
    $optionsResolver = new OptionsResolver();
    $optionsResolver->setDefaults([
        'email' => '',
        'phone' => '',
    ]);
    $filter = $optionsResolver->resolve($request->query->all());

    /** @var CustomerRepository $customerRepository */
    $customerRepository = $this->getDoctrine()->getRepository('AppBundle:Customer');

    /** @var Customer[] $customers */
    $customers = $customerRepository->findFilteredCustomers($filter);

    return $this->render(':customers:index.html.twig', [
        'customers' => $customers,
        'filter' => $filter,
    ]);
}

Mais informações OptionsResolver- http://symfony.com/doc/current/components/options_resolver.html


8

Como agora o $this->getRequest()método está obsoleto, você precisa injetar um Requestobjeto na sua ação do controlador desta maneira:

public function someAction(Request $request)

Depois disso, você pode usar um dos seguintes.

Se você deseja buscar dados POST da solicitação, use o seguinte:

$request->request->get('var_name');

mas se você deseja buscar dados GET da solicitação, use este:

$request->query->get('var_name');

6

Você pode fazer isso:

$clientName = $request->request->get('appbundle_client')['clientName'];

Às vezes, quando os atributos estão protegidos, você não pode ter acesso para obter o valor do método comum de acesso:

(POSTAR)

 $clientName = $request->request->get('clientName');

(OBTER)

$clientName = $request->query->get('clientName');

(GENÉRICO)

$clientName = $request->get('clientName');

1
Bem-vindo ao Stack Overflow. Formate a sua resposta para torná-lo mais legível próxima vez e também verificar esta página de ajuda: Como responder
Fabian Horlacher

e se houver 2 valor após get? como este$clientName = $request->query->get('clientName','any');
Munkhdelger Tumenbayar 14/10/19

3

A maioria dos casos, como obter parâmetros de sequência ou formulário de consulta, é abordada nas respostas acima.

Ao trabalhar com dados brutos, como uma string JSON bruta no corpo que você gostaria de fornecer como argumento json_decode(), o método Request::getContent()pode ser usado.

$content = $request->getContent();

Informações úteis adicionais sobre solicitações HTTP no Symfony podem ser encontradas na documentação do pacote HttpFoundation .


1
$request = Request::createFromGlobals();
$getParameter = $request->get('getParameter');

Ainda é este o caminho a seguir para funções que não possuem o Requestparâmetro? (por exemplo, em funções privadas da classe controller, por exemplo)
fritzmg 28/11

1
use Symfony\Component\HttpFoundation\Request;

public function indexAction(Request $request, $id) {

    $post = $request->request->all();

    $request->request->get('username');

}

Obrigado, você também pode usar o código acima


0

Se você precisar obter o valor de uma seleção, poderá usar:

$form->get('nameSelect')->getClientData();

0

Tente isso, funciona

$this->request = $this->container->get('request_stack')->getCurrentRequest();

Saudações


Isso não responde à pergunta. A pessoa que faz a pergunta já tem acesso ao objeto de solicitação.
Layton Everson

1
@LaytonEverson desculpe, mas você está enganado, seu método // $ this-> getRequest () está obsoleto desde o 2.4, é por isso que não está funcionando, então ele realmente não tem acesso ao objeto de solicitação;)
AchrafSoltani

Embora você não esteja errado sobre isso, o solicitante está se perguntando qual método recupera uma variável do objeto de solicitação. @Cerad respondeu a esta pergunta corretamente. Ele não apenas forneceu a maneira correta de acessar o objeto Request, mas também respondeu à pergunta.
Layton Everson

0
public function indexAction(Request $request)
{
   $data = $request->get('corresponding_arg');
   // this also works
   $data1 = $request->query->get('corresponding_arg1');
}

1
Embora esse código possa responder à pergunta, seria melhor incluir algum contexto, explicando como ele funciona e quando usá-lo. Respostas somente de código não são úteis a longo prazo.
Bono

0

Para usuários do symfony 4:

$query = $request->query->get('query');

0

# www.example / register / admin

  /**
 * @Route("/register/{role}", name="app_register", methods={"GET"})
 */
public function register(Request $request, $role): Response
{
 echo $role ;
 }
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.