2012-04-07 22 views
18

¿Cómo puedo generar un enlace desde un servicio? Inyecté "enrutador" dentro de mi servicio, sin embargo, los enlaces generados son /view/42 en lugar de /app_dev.php/view/42. ¿Como puedo resolver esto?Generar un enlace desde un servicio

Mi código es algo como esto:

services.yml

services: 
    myservice: 
     class: My\MyBundle\MyService 
     arguments: [ @router ] 

MyService.php

<?php 

namespace My\MyBundle; 

class MyService { 

    public function __construct($router) { 

     // of course, the die is an example 
     die($router->generate('BackoffUserBundle.Profile.edit')); 
    } 
} 
+0

¿Podría pegar el código donde genera las URL? –

+0

Si accede a su sitio a través de 'http: // test/app_dev.php', los enlaces serán con app_dev.php. Para 'http: // test' estarán sin app_dev.php ... – meze

+0

@kuba: He editado mi pregunta. –

Respuesta

28

Por lo tanto: Se necesitan dos cosas.

En primer lugar, tendrá que tener una dependencia en @router (para obtener generate()).

En segundo lugar, debe establecer el alcance de su servicio para "solicitar" (me lo he perdido). http://symfony.com/doc/current/cookbook/service_container/scopes.html

Su services.yml se convierte en:

services: 
    myservice: 
     class: My\MyBundle\MyService 
     arguments: [ @router ] 
     scope: request 

Ahora usted puede utilizar la función de generador del servicio @router!


Nota importante en relación con Symfony 3.x: como dice el doc,

El concepto de "contenedor ámbitos" explica en este artículo ha sido obsoletas en Symfony 2.8 y se eliminará en Symfony 3.0.

utilizar el servicio request_stack (introducido en Symfony 2.4) en lugar de la request servicio/alcance y utilizar el ajuste shared (introducido en Symfony 2.8) en lugar del prototype alcance (leer más sobre compartidos servicios).

+0

No lo entiendo ¿Cómo ayudó? El alcance no tiene nada que ver con 'app_dev.php'. – meze

+0

Si la solicitud no está disponible cuando se utiliza el enrutador, el contexto (getContext()) del enrutador no utilizará las informaciones de solicitud (es decir, el host) y la ruta no se generará por completo. Establecer el alcance garantiza que la solicitud estará activa cuando se creará mi servicio Tenga en cuenta que hubo un segundo problema específico: estaba cargando mis servicios en el arranque del paquete, por lo que la solicitud no se había cargado todavía. –

+0

"tendrá que tener una dependencia en @router (para obtener generate())". No entiendo, ¿cuál es tu respuesta allí diferente de tu pregunta? – Toskan

2

tuve una similar issue, pero usando Symfony 3. Aunque eludió en la respuesta anterior, que era un poco difícil de averiguar exactamente cómo se podría usar request_stack para lograr lo mismo que scope: request.

En el caso de esta pregunta, se vería algo como esto:

La configuración services.yml

services: 
    myservice: 
     class: My\MyBundle\MyService 
     arguments: 
      - '@request_stack' 
      - '@router' 

y la clase MyService

<?php 

    namespace My\MyBundle; 

    use Symfony\Component\Routing\RequestContext; 

    class MyService { 

     private $requestStack; 
     private $router; 

     public function __construct($requestStack, $router) { 
      $this->requestStack = $requestStack; 
      $this->router = $router; 
     } 

     public doThing() { 
      $context = new RequestContext(); 
      $context->fromRequest($this->requestStack->getCurrentRequest()); 
      $this->router->setContext($context); 
      // of course, the die is an example 
      die($this->router->generate('BackoffUserBundle.Profile.edit')); 
     } 
    } 

Nota: Acceso RequestStack en el constructor es advised against ya que podría intentar acceder a él antes de que se maneje la solicitud por el kernel. Por lo tanto, puede devolver nulo al intentar recuperar el objeto de solicitud de RequestStack.

Cuestiones relacionadas