2011-12-05 39 views
5

Trong symfony 1.4 bạn có thể định nghĩa một lớp đường tùy chỉnh, nơi bạn ghi đè lên các thế hệ của url với logic tùy chỉnh, ví dụ:Tuỳ chỉnh lộ trình lớp

custom: 
    class: sfDoctrineRouteCollection 
    options: 
    model:    Custom 
    prefix_path:   /custom/category/:category_id 
    column:    id 
    route_class:   CustomDoctrineRoute 

class CustomDoctrineRoute extends sfDoctrineRoute 
{ 
    public function generate($params, $context = array(), $absolute = false) 
    { 
    if (!isset($params['category_id'])) { 
     $params['category_id'] = sfContext::getInstance()->getRequest()->getParameter('category_id'); 
    } 

    return parent::generate($params, $context, $absolute); 
    } 

} 

này cho phép để viết url_for('custom_show', array('id'=> $object['id'])) và không bận tâm về các tham số phụ thuộc bối cảnh (Thể loại ID).

Làm thế nào để bạn tiếp cận điều này là symfony2?

+0

Ở đây tôi đã giải quyết vấn đề tương tự bằng cách ghi đè UrlGenerator: http://stackoverflow.com/questions/8877806/symfony2-use-object-to-set-route-parameters – Dziamid

Trả lời

3

Tôi có thể nghĩ đến 2 phương pháp này. Đầu tiên, và đơn giản nhất, là để mở rộng các lớp Router với riêng bạn và nói với symfony sử dụng lớp học của bạn trong parameters.yml hoặc config.yml của bạn:

parameters: 
    router.class: Company\CoreBundle\Routing\MyCustomRouter 

Có một mạnh hơn (đọc: phức tạp) giải pháp mà cho phép bạn xác định nhiều phụ thuộc hơn trên lớp bộ định tuyến của mình bằng cách ghi đè hoặc mở rộng toàn bộ bộ định tuyến dịch vụ. Có một gói thực hiện điều này được gọi là BeSimpleI18nRoutingBundle mà bạn có thể xem để xem cách thực hiện.

Cụ thể, hãy chú ý đến số CompilerPass nơi họ thay thế dịch vụ router mặc định của riêng mình. Sau đó, bạn phải triển khai RouterInterface trong lớp bộ định tuyến của riêng mình. Trong gói đặc biệt này, họ inject the original default router (sau khi đổi tên nó trong trình biên dịch).