2012-07-23 33 views
17

Có lẽ tôi đang thiếu một cái gì đó nhưng có vẻ không phải là một cách để xác định các tham số chuỗi truy vấn trong các tuyến đường trong Symfony2 để chúng có thể được chuyển vào một bộ điều khiển.Symfony2: Cách chuyển thông số chuỗi truy vấn url vào bộ điều khiển?

Ví dụ, thay vì tạo ra một URI như /blog/my-blog-post (từ Symfony2 của routing documentation) và đi qua nó để các tuyến đường sau:

# app/config/routing.yml  
blog_show: 
    pattern: /blog/{slug} 
    defaults: { _controller: AcmeBlogBundle:Blog:show } 

Tôi muốn tạo ra một URI như /blog?slug=my-blog-post. Vấn đề là tôi không thể tìm thấy bất cứ nơi nào để xác định tham số slug trong tệp cấu hình tuyến đường (như đối tác {slug} ở trên).

Có lẽ đây là mục đích nhưng sau đó thực hành tốt nhất để làm việc với các tham số GET trong chuỗi truy vấn là gì?

Tài liệu đề cập đến chúng trong Generating URLs with Query Strings, vậy làm thế nào để chuyển chúng vào bộ điều khiển?

đâu tôi có thể tìm thấy đề cập đến trong số họ là Symfony2 and HTTP Fundamentals:

use Symfony\Component\HttpFoundation\Request; 

$request = Request::createFromGlobals(); 

// retrieve GET variables 
$request->query->get('foo'); 

Đây có phải là cách tốt để làm việc với họ bên trong bộ điều khiển?

Trả lời

44

Để làm việc với các thông số GET/POST trong một bộ điều khiển mở rộng Symfony \ Bundle \ FrameworkBundle \ khiển \ Controller:

public function updateAction() 
{ 
    $request = $this->getRequest(); 
    $request->query->get('myParam'); // get a $_GET parameter 
    $request->request->get('myParam'); // get a $_POST parameter 
    ... 
} 

Đối với một bộ điều khiển mà không mở rộng bộ điều khiển cơ sở Symfony, khai báo đối tượng yêu cầu như một tham số của phương pháp hành động và tiến hành như trên:

public function updateAction(Request $request) 
{ 
    $request->query->get('myParam'); // get a $_GET parameter 
    $request->request->get('myParam'); // get a $_POST parameter 
    ... 
} 
+12

Vì Symfony 2.4, phương thức 'getRequest()' không có w không được sử dụng và một nên sử dụng thủ thuật thứ hai, với tham số 'Request' trong phương thức điều khiển. Phương thức 'getRequest()' sẽ được gỡ bỏ trong Symfony 3. – Brewal

+0

@Brewal: nhưng nếu bạn có một 'Controller' mở rộng' Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller' và nó đã nhận được các tham số như được định nghĩa trong route của nó, bạn vẫn có thể nhận được yêu cầu theo cách này hay bạn chỉ đơn giản là phải sử dụng 'Request :: createFromGlobals()' bây giờ? – fritzmg

+1

Bạn vẫn có thể nhận được yêu cầu nhờ loại 'Request' được chỉ định ngay trước biến' $ request'. Symfony đủ thông minh để đoán điều đó. – Brewal

26

Bạn không thể chỉ định tham số chuỗi truy vấn trong tệp cấu hình định tuyến. Bạn chỉ nhận được chúng từ đối tượng $ request trong bộ điều khiển của bạn: $request->query->get('foo'); (sẽ là null nếu nó không tồn tại).

Và để tạo ra một con đường với một tham số nhất định, bạn có thể làm điều đó trong bạn cành mẫu như thế:

{{ path(route, query|merge({'page': 1})) }} 

Nếu bạn muốn tạo ra một lộ trình trong điều khiển của bạn, nó giống như trong tài liệu bạn được liên kết:

$router->generate('blog', array('page' => 2, 'category' => 'Symfony')); 

sẽ tạo tuyến đường /blog/2?category=Symfony (thông số không tồn tại trong định nghĩa tuyến đường sẽ được chuyển thành chuỗi truy vấn).

+0

Tài liệu: [tạo-urls-với-query-strings] (http://symfony.com/doc/current/routing.html#generating-urls -with-query-strings) – Stphane

Các vấn đề liên quan