2011-12-05 13 views
5

En Symfony 1.4 se puede definir una clase de ruta personalizada, donde podrá reemplazar la generación de URL con cierta lógica de negocio, por ejemplo:personalizado clase de ruta

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

} 

Esto permite escribir url_for('custom_show', array('id'=> $object['id'])) y no preocuparse por los parámetros dependientes del contexto (categoria ID).

¿Cómo te acercas a esto es symfony2?

+0

Aquí he resuelto un problema similar anulando UrlGenerator: http://stackoverflow.com/questions/8877806/symfony2-use-object-to-set-route-parameters – Dziamid

Respuesta

3

Puedo pensar en 2 enfoques para esto. La primera, y más simple, es extender la clase Router con su propio y decirle a Symfony utilizar su clase en su parameters.yml o config.yml:

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

Hay una más potente (es decir: complicado) solución que le permite definir más dependencias en su clase de enrutador anulando o ampliando todo el enrutador servicio. Hay un paquete que hace esto llamado BeSimpleI18nRoutingBundle que puede ver para ver cómo se hace.

Específicamente, observe el CompilerPass donde reemplazan el servicio predeterminado router con el suyo. Luego debe implementar el RouterInterface en su propia clase de enrutadores. En este paquete particular, ellos inject the original default router (después de haberlo cambiado de nombre en el pase del compilador).

Cuestiones relacionadas