2012-04-07 18 views
18

Jak mogę wygenerować łącze z usługi? Wprowadziłem "router" do mojej usługi, jednak generowane łącza to /view/42 zamiast /app_dev.php/view/42. Jak mogę to rozwiązać?Generowanie linku z usługi

Mój kod jest coś takiego:

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

Czy możesz wkleić kod, w którym generujesz adresy URL? –

+0

Jeśli uzyskujesz dostęp do swojej witryny za pomocą 'http: // test/app_dev.php', to linki będą z app_dev.php. Dla 'http: // test' będą one bez app_dev.php ... – meze

+0

@kuba: Edytowałem moje pytanie. –

Odpowiedz

28

tak: trzeba dwie rzeczy.

Przede wszystkim będziesz musiał mieć zależność od @routera (aby uzyskać generate()).

Po drugie, musisz ustawić zakres swojej usługi na "żądanie" (nie udało mi się tego). http://symfony.com/doc/current/cookbook/service_container/scopes.html

Twój services.yml staje:

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

Teraz można użyć funkcji Generator SERVICE @router głównej!


Ważna uwaga dotycząca Symfony 3.x: Jak doc mówi

„pojemnik zakresy” koncepcji opisanej w tym artykule została przestarzałe w Symfony 2.8 i zostanie on usunięty w Symfony 3.0.

Użyj usługi request_stack (wprowadzone w Symfony 2.4) zamiast request usługi/zakres i użyć ustawienia shared (wprowadzone w Symfony 2.8) zamiast zakresu prototype (czytaj więcej o wspólną usług).

+0

Nie rozumiem tego. Jak to pomogło? Zakres nie ma nic wspólnego z 'app_dev.php'. – meze

+0

Jeśli żądanie nie jest dostępne, gdy router jest używany, kontekst (getContext()) routera nie będzie używał informacji o żądaniu (np. Hosta), a ścieżka nie zostanie w pełni wygenerowana. Ustawienie zakresu zapewnia, że ​​żądanie będzie aktywne, gdy moja usługa zostanie utworzona. Zauważ, że wystąpił drugi konkretny problem: ładowałem moje usługi przy rozruchu pakietu, więc żądanie nie zostało jeszcze załadowane. –

+0

"będziesz musiał mieć zależność od @routera (aby uzyskać generate())." Nie rozumiem, z jakiej odpowiedzi Pan różni się od twojego pytania? – Toskan

2

miałem similar issue, ale przy użyciu Symfony 3. Podczas wymykał się w poprzedniej odpowiedzi, to było trochę trudne, aby dowiedzieć się, jak dokładnie można by użyć request_stack osiągnąć to samo, co scope: request.

W przypadku na to pytanie jest, że to wyglądać mniej więcej tak:

services.yml config

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

a klasa 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')); 
     } 
    } 

Uwaga: Dostęp RequestStack w konstruktorem jest advised against, ponieważ może on potencjalnie próbować uzyskać do niego dostęp, zanim żądanie zostanie obsłużone przez jądro. Więc może zwrócić wartość null podczas próby pobrania obiektu żądania z RequestStack.