Làm thế nào để có được các tham số yêu cầu trong symfony2


203

Tôi rất mới với symfony. Trong các ngôn ngữ khác như java và các ngôn ngữ khác tôi có thể sử dụng request.getParameter('parmeter name')để nhận giá trị.

Có điều gì tương tự mà chúng ta có thể làm với symfony2.
Tôi đã thấy một số ví dụ nhưng không có gì làm việc cho tôi. Giả sử tôi có một trường mẫu với tên người dùng . Trong hành động biểu mẫu, tôi đã cố gắng sử dụng một cái gì đó như thế này:

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

Tôi cũng đã thử

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

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

Nhưng không có tùy chọn nào hoạt động. Tuy nhiên, sau đây hoạt động tốt:

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

Tôi đang làm sai ở đâu trong việc sử dụng getParameter()phương pháp. Bất kỳ trợ giúp sẽ được đánh giá cao.


Bạn có một lỗi đánh máy ở dòng hai: $request->request-get()nên $request->request->get(). Có thể như vậy?
tạm dừng

đã viết tương tự trong code.missed out here. Xin lỗi cho lỗi đánh máy ở đây. cho đến khi điều này không hoạt động.
Abdul Hamid

Bạn (a) đã kiểm tra hướng dẫn để đảm bảo rằng đó get()là phương pháp đúng và (b) đã bật các thông báo PHP để bạn có thể xem liệu có bất kỳ vấn đề nào không? (c) Symfony 2 có thanh công cụ gỡ lỗi như symfony 1 không, vì vậy bạn có thể xem bạn đã mắc lỗi gì chưa?
tạm dừng

Bạn có nhầm lẫn tên và tên người dùng?
greg0ire

Có nhiều thông tin hơn ở đây: roadtodev.com/recuperer-objet-request-de-symfony
Thomas Bredillet

Câu trả lời:


416

Việc đặt tên không hoàn toàn trực quan:

use Symfony\Component\HttpFoundation\Request;

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

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

46
Nó khác với những gì PHP sử dụng, nhưng nó thực sự có ý nghĩa hơn. $_GETdữ liệu là dữ liệu từ chuỗi truy vấn (hoàn toàn không GETcần yêu cầu) và $_POSTdữ liệu là dữ liệu từ cơ thể yêu cầu (không phải là POSTyêu cầu, cũng có thể PUT).
igorw

5
đã thử $ request-> truy vấn-> get ('name'); nhưng nó cũng không hoạt động.
Abdul Hamid

7
Làm cách nào để có được các tham số từ yêu cầu PUT?
Tjorriemorrie

10
Đặt tên rất lạ ở đây, chắc chắn $request->get$request->postsẽ đơn giản hơn.
crmpicco

3
nhận xét từ igorw mang lại sự rõ ràng cho quy ước đặt tên kỳ dị này
Dheeraj

32

Tôi làm điều đó thậm chí còn đơn giản hơn:

use Symfony\Component\HttpFoundation\Request;

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

Một tùy chọn khác là đưa các tham số của bạn vào định nghĩa hàm hành động của bạn:

use Symfony\Component\HttpFoundation\Request;

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

trong đó, sau đó giả sử rằng bạn đã xác định {foo} và {bar} là một phần của mẫu URL trong tệp định tuyến của bạn:

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

và trong ví dụ đầu tiên, nếu tôi có footham số cả trong chuỗi truy vấn và trong phần thân POST, cái nào sẽ được trả về $request->get('foo')?
Dimitry K

1
Có vẻ như quyền ưu tiên là GET, PATH, POST api.symfony.com/master/Symfony/Component/HttpFoundation/ Lỗi
Dimitry K

Đây là câu trả lời tốt nhất
steampowered

7
Không, không phải vậy. Tài liệu của chính phương thức này nói rằng nó không được khuyến khích sử dụng vì nó nặng hơn việc truy cập các tham số GET / POST thông qua các bộ sưu tập cụ thể của chúng.
Nhím

1
Câu trả lời là $request->get('foo'); hoạt động chính xác cho TẤT CẢ các túi (thứ tự là: PATH, GET, POST). Tuy nhiên, $request->request->get('foo');chỉ hoạt động cho túi POST. Cuối cùng, cái đầu tiên ( $request->get()) không được khuyến nghị nếu chúng ta biết dữ liệu ở đâu (GET / POST).
F2000

18

Bạn có thể sử dụng mã sau đây để nhận các giá trị trường biểu mẫu của bạn

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');
}

Hoặc Bạn cũng có thể lấy tất cả các giá trị biểu mẫu dưới dạng mảng bằng cách sử dụng

$request->request->all()

3
$ request-> request-> all () đang hoạt động với tôi nhưng đại loại như $ request-> truy vấn-> get ('foo'); không hoạt động.
Abdul Hamid

13

thử

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

kiểm tra tên thuộc tính của trường hình thức của bạn


1
+1, vì tôi nghĩ rằng trong tất cả các phản hồi, chỉ có điều này thực sự nói lên điều không rõ ràng - trong trường hợp bạn đã tự động tạo biểu mẫu của mình với sự trợ giúp của trình tạo biểu mẫu của symfony, symfony đổi tên trường biểu mẫu thành một cái gì đó nhiều hơn bạn chờ đợi. Giống như name = "acme_demobundle_userform [field_name]"
userfuser

Cú pháp bạn đề cập ở đây không hoạt động với php 5.3.10. Phiên bản tối thiểu để hỗ trợ đó là gì?
Justinas Lelys

2
@justinasLelys thử $ userType = $ request-> request-> get ('acme_demobundle_usertype'); $ tên người dùng = $ userType ['tên người dùng'];
ngủ-

@JustinasLelys Cú pháp là PHP 5.4
COil

"Tên người dùng" không thể được xác định. Vì vậy, tốt hơn kiểm tra với "??" Đầu tiên.
Viktor Sydorenko

9

Bên trong bộ điều khiển:

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

6
Trong các phiên bản mới hơn của Symfony, $this->getRequest()không được chấp nhận, ủng hộ việc đưa Yêu cầu vào hành động của bộ điều khiển, ví dụ:public function showAction(Request $request, $id);
Adam Elsodaney 4/12/14

9

Lựa chọn của bạn:

  1. Đơn giản:
    • $request->request->get('param')( $_POST['param']) hoặc
    • $request->query->get('param')( $_GET['param'])
  2. Các biểu mẫu Symfony tốt với tất cả xác thực, chuyển đổi giá trị và hiển thị biểu mẫu có lỗi và nhiều tính năng khác:
  3. Một cái gì đó ở giữa (xem ví dụ dưới đây)
<?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,
    ]);
}

Tìm hiểu thêm về OptionsResolver- http://symfony.com/doc/civerse/components/options_resolver.html


8

Vì hiện tại $this->getRequest()phương thức không được dùng nữa, bạn cần đưa Requestđối tượng vào hành động điều khiển của mình như thế này:

public function someAction(Request $request)

sau đó bạn có thể sử dụng một trong những điều sau đây

Nếu bạn muốn tìm nạp dữ liệu POST từ yêu cầu, hãy sử dụng như sau:

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

nhưng nếu bạn muốn tìm nạp dữ liệu GET từ yêu cầu, hãy sử dụng điều này:

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

6

Bạn có thể làm điều này:

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

Đôi khi, khi các thuộc tính được bảo vệ, bạn không thể có quyền truy cập để lấy giá trị cho phương thức truy cập phổ biến:

(BÀI ĐĂNG)

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

(ĐƯỢC)

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

(CHUNG)

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

1
Chào mừng bạn đến với Stack Overflow. Vui lòng định dạng câu trả lời của bạn để làm cho nó dễ đọc hơn vào lần tới và cũng kiểm tra trang trợ giúp này: Cách trả lời
Fabian Horlacher

Nếu có 2 giá trị sau khi nhận thì sao? như thế này$clientName = $request->query->get('clientName','any');
Munkhdelger Tumenbayar

3

Hầu hết các trường hợp như nhận được chuỗi truy vấn hoặc tham số biểu mẫu được đề cập trong các câu trả lời ở trên.

Khi làm việc với dữ liệu thô, như một chuỗi JSON thô trong phần thân mà bạn muốn đưa ra làm đối số json_decode(), phương thức Request::getContent()có thể được sử dụng.

$content = $request->getContent();

Thông tin hữu ích bổ sung về các yêu cầu HTTP trong Symfony có thể được tìm thấy trên tài liệu của gói HTTPFoundation .


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

Đây có phải là cách để đi cho các chức năng không có Requesttham số? (ví dụ: trong các chức năng riêng của lớp trình điều khiển chẳng hạn)
fritzmg

1
use Symfony\Component\HttpFoundation\Request;

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

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

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

}

Cảm ơn, bạn cũng có thể sử dụng mã ở trên


0

Nếu bạn cần nhận giá trị từ một lựa chọn, bạn có thể sử dụng:

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

0

Hãy thử nó, nó hoạt động

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

Trân trọng


Điều này không trả lời câu hỏi nào cả. Người đặt câu hỏi đã vội truy cập vào đối tượng yêu cầu.
Layton Everson

1
@LaytonEverson xin lỗi nhưng bạn đang nhầm lẫn, phương pháp của ông // $ this-> getRequest () bị phản đối từ 2.4, đó là lý do tại sao nó không làm việc, vì vậy ông không thực sự được tiếp cận với các đối tượng yêu cầu;)
AchrafSoltani

Mặc dù bạn không sai về điều đó, nhưng người hỏi đang tự hỏi phương thức nào lấy một biến từ đối tượng yêu cầu. @Cerad trả lời đúng câu hỏi này. Anh ta không chỉ cung cấp cách chính xác để truy cập vào đối tượng Yêu cầu, anh ta còn trả lời câu hỏi.
Layton Everson

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

1
Mặc dù mã này có thể trả lời câu hỏi, nhưng sẽ tốt hơn nếu bao gồm một số bối cảnh, giải thích cách thức hoạt động và khi nào sử dụng nó. Câu trả lời chỉ có mã là không hữu ích trong thời gian dài.
Bono

0

Đối với người dùng symfony 4:

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

0

# www.example / đăng ký / quản trị viên

  /**
 * @Route("/register/{role}", name="app_register", methods={"GET"})
 */
public function register(Request $request, $role): Response
{
 echo $role ;
 }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.