2012-04-27 31 views
8

Tại đây bạn có thể tìm thấy n-câu hỏi trên Symfony2 của tôi.Làm cách nào để chạy được tên tuyến đường trong Symfony2 khi sử dụng mô tả tuyến đường yaml?

Tôi đang làm việc với một số pagination bundle sử dụng tên tuyến đường được cung cấp trong tệp routing.yml. Theo quan điểm của tôi, cách tiếp cận này không linh hoạt và dẫn đến một mã bẩn, vì nếu tôi thay đổi tên của tuyến đường, thì tôi phải xem tất cả các mẫu Twig hoặc tệp PHP để cập nhật tên tuyến. Điều này là tốt cho các ứng dụng Web nhỏ, nhưng sẽ cung cấp một lỗi như vậy cho các ứng dụng lớn hơn và cũng cần một gánh nặng lớn cho nhà phát triển.

Vì vậy, tôi đã tự hỏi chuyển một biến chuỗi x đến đối tượng Pager được cung cấp bởi gói được đề cập ở trên. Chuỗi x phải được khởi tạo trong bộ điều khiển và phải cung cấp tên tuyến đường mong muốn như được đưa ra trong tệp routing.yml.

Hãy để tôi đưa ra một ví dụ. Các tập tin định tuyến như sau:

//routing.yml 
AcmeTestBundle_listall: 
pattern: /test/page/{page} 
defaults: { _controller: AcmeTestBundle:List:listall, page: 1 } 
requirements: 
    page: \d+ 

Sau đó, bộ điều khiển có liên quan là:

//use something.... 
class ListController extends Controller 
{ 

    public function exampleAction($page) 
    { 
    $array = range(1, 100); 
    $adapter = new ArrayAdapter($array); 
    $pager = new Pager($adapter, array('page' => $page, 'limit' => 25)); 

    return array('pager' => $pager); 
    } 
} 

Sau đó, trong mẫu cành lá, các $pager nhận tên đường mà tham khảo các gói trên

{% if pager.isPaginable %} 
    {{ paginate(pager, 'AcmeTestBundle_listall') }} 
{% endif %} 
{% for item in pager.getResults %} 
    <p>{{ item }}</p> 
{% endfor %} 

Bất kỳ ý tưởng nào về cách nhận giá trị chuỗi 'AcmeTestBundle_listall' khi chạy ngay bên trong bộ điều khiển?

Trả lời

30

Bạn có thể sử dụng biến số toàn cầu app có sẵn trong cành để lấy tuyến hiện tại từ yêu cầu.

{% if pager.isPaginable %} 
    {{ paginate(pager, app.request.get('_route') }} 
{% endif %} 

Thông tin thêm về appherehere.

+0

Chắc chắn! Cảm ơn bạn rất nhiều! Câu trả lời nhanh và rõ ràng ... rất được đánh giá cao! – JeanValjean

+0

Để thêm vào điều này, nếu bạn cần tham số tuyến đường, hãy sử dụng app.request.get ('_ route_params') –

+3

Symfony lưu trữ tên tuyến đường dưới dạng thuộc tính * của Yêu cầu, vì vậy tốt hơn nên được truy xuất như sau: 'app .request.attributes.get ('_ route') '. Tránh sử dụng phương thức 'Request :: get()' vì nó lần đầu tiên cố gắng lấy tham số từ túi tham số truy vấn - túi thuộc tính chỉ được sử dụng như một dự phòng. Điều đó nói rằng, bằng cách sử dụng 'Request :: get()', người dùng có thể ghi đè '_route' bằng cách nối'? _route = my_tainted_param' vào URL. –

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