2012-09-11 29 views
12

he definido una ruta en mi archivo de enrutamiento de aplicación:de búsqueda de rutas en Symfony 2

RouteName: 
    pattern: /some/route 
    defaults: { _controller: MyAppBundle:Controller:action } 

En un controlador que puede utilizar:

$this->get('router')->generate('RouteName'); 

¿Cómo acceder simplemente que a partir de un nuevo clase se crea, por ejemplo, una clase de vista que no se extiende nada:

namespace My\AppBundle\View; 

class ViewClass { 
    public function uri() 
    { 
     return getTheRoute('RouteName'); 
    } 
} 
+0

Puede explicar más sobre la 'ViewClass' que está creando? ¿Cuál es la conexión entre 'ViewClass' y la plantilla? –

Respuesta

34

que necesita inyectarse servicio "enrutador" en sus ViewClass. P.ej. en el lugar donde su definen su servicio ViewClass:

viewclass.service: 
    class: Namespace\For\ViewClass 
    arguments: 
     router: "@router" 

y luego en su constructor:

public function __construct(\Symfony\Bundle\FrameworkBundle\Routing\Router $router) 
{ 
    $this->router = $router; 
} 
+0

No estoy seguro de entender esto realmente, ¿así que tendría que pasar por el enrutador donde sea que llame a VewClass? 'nueva ViewClass (nuevo Router())'? –

+1

No exactamente. Porque en cualquier lugar de su proyecto necesita una instancia de ViewClass, obtendrá una a través del Endepency Injection Container. Por ejemplo, si define el servicio ViewClass como en mi respuesta, en su controlador lo obtiene de esta manera: $ viewClass = $ this-> get ('viewclass.service') y no le importa crear un nuevo objeto usted mismo. Definirlo en service.yml es suficiente – Cyprian

+0

¡Gracias, eso funciona ahora! –

1

La clave está en cómo el método $this->generateUrl() funciona en controladores. Ver:

/** 
* Generates a URL from the given parameters. 
* 
* @param string $route  The name of the route 
* @param mixed $parameters An array of parameters 
* @param Boolean $absolute Whether to generate an absolute URL 
* 
* @return string The generated URL 
*/ 
public function generateUrl($route, $parameters = array(), $absolute = false) 
{ 
    return $this->container->get('router')->generate($route, $parameters, $absolute); 
} 

Así que tendrá que definir su clase como un servicio e inyectar el servicio @router. O eso o haz que tu clase implemente ContainerAwareInterface, pero el primer método definitivamente sería mejor.

+0

No estoy seguro de que crear un servicio sea lo mejor para mí, ya que estoy creando una ViewClass para cada vista de mi sitio (mucho). Por lo tanto, cada ViewClass normalmente solo se usará en un solo lugar y, por lo tanto, no es realmente un servicio. ¿Puede darnos un poco más de información sobre la implementación de ContainerAwareInterface?¿Es esa la única clase que necesito cargar? –

+0

En realidad, creo que todavía necesitará definir la clase como un servicio para hacer uso de ContainerAwareInterface. Todo esto haría automáticamente llamar 'setContainer' en su clase antes de proporcionarlo, lo que le permite acceder a cualquier servicio en el contenedor. No debe preocuparse por crear un servicio, es una operación muy económica. – RobMasters

1

Debe registrar su clase como un servicio e insertar el enrutador como una dependencia.

Consulte el chapter on the service container en los excelentes documentos symfony2.

Si no está familiarizado con los conceptos de contenedor de servicio e inyección de dependencia, puede sentirse un poco abrumado. Sin embargo, haz tu mejor esfuerzo para comprenderlo, ya que es una parte esencial de la arquitectura de symfony2.

0

Puede pasar todo el contenedor de su controlador a su clase de vista en la creación de instancias. Esto es NO MEJOR PRÁCTICA y no se recomienda.

class View 
{ 
    protected $container; 

    public function __construct(\Symfony\Component\DependencyInjection\Container $container) 
    { 
    $this->container = $container; 
    } 
} 

Luego, en el código se podría utilizar

$this->container->get('router')->generate($route, $parameters, $absolute); 
+3

¿Por qué sugeriría esto si no es una buena práctica? – theunraveler

+0

Responde a la pregunta, no es la forma en que debería hacerlo, pero es la forma en que el OP tendría que hacerlo para mantener el patrón descrito en su pregunta. –

+0

no hagas esto .... – user3886650