2012-05-04 28 views
26

Tôi đã sử dụng Silex trong một ngày và tôi có câu hỏi "ngu ngốc" đầu tiên. Nếu tôi có:Làm thế nào để có được tất cả các tham số GET trên Silex?

$app->get('/cities/{city_id}.json', function(Request $request, $city_id) use($app) { 
    .... 
}) 
->bind('city') 
->middleware($checkHash); 

Tôi muốn có được tất cả các thông số (city_id) bao gồm trong middleware:

$checkHash = function (Request $request) use ($app) { 

    // not loading city_id, just the parameter after the ? 
    $params = $request->query->all(); 

    .... 
} 

Vì vậy, làm thế nào để tôi nhận được city_id (cả tên tham số và giá trị của nó) bên trong phần mềm trung gian. Tôi sẽ có 30 hành động, vì vậy tôi cần một cái gì đó có thể sử dụng và duy trì được.

Tôi đang thiếu gì?

cảm ơn rất nhiều!

Giải pháp

Chúng ta cần phải có được những thông số thêm $ request-> thuộc tính

$checkHash = function (Request $request) use ($app) { 

    // GET params 
    $params = $request->query->all(); 

    // Params which are on the PATH_INFO 
    foreach ($request->attributes as $key => $val) 
    { 
     // on the attributes ParamaterBag there are other parameters 
     // which start with a _parametername. We don't want them. 
     if (strpos($key, '_') != 0) 
     { 
      $params[ $key ] = $val; 
     } 
    } 

    // now we have all the parameters of the url on $params 

    ... 

}); 
+0

nó trông giống như -> middleware() không tồn tại nữa? – Tobias

Trả lời

60

Trong Request đối tượng bạn có quyền truy cập vào nhiều túi tham số, cụ thể:

  • $request->query - thông số GET
  • $request->request - POST thông số
  • $request->attributes - yêu cầu các thuộc tính (bao gồm các thông số phân tích cú pháp từ PATH_INFO)

$request->query chỉ chứa tham số GET. city_id không phải là tham số GET. Đó là một thuộc tính được phân tích cú pháp từ PATH_INFO.

Silex sử dụng một số Symfony Components. Các lớp Request và Response là một phần của HttpFoundation. Tìm hiểu thêm về nó từ docs Symfony:

+0

cảm ơn kuba, bạn đã chỉ cho tôi giải pháp. Tôi đã thêm nó vào câu hỏi. – fesja

+3

Một nhận xét. Luôn sử dụng các bộ so sánh chặt chẽ với strpos ("! ==" và không phải "! ="). Nhớ hơn null và 0 là "bằng nhau" khi so sánh với == (nhưng không bằng nhau so với ===). –

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