2014-12-13 15 views
19

Jestem nowy w świecie symfonii. chcę użyć renderowanie w mojej służbie, ale mam ten błądRenderowanie w mojej usłudze

Zaproszenie do metody nieokreślone renderView

wiem, że renderView to skrót od

/** 
* Returns a rendered view. 
* 
* @param string $view  The view name 
* @param array $parameters An array of parameters to pass to the view 
* 
* @return string The rendered view 
*/ 
public function renderView($view, array $parameters = array()) 
{ 
    return $this->container->get('templating')->render($view, $parameters); 
} 

Ale don” t wiem, co mam do iniekcji w mojej służbie. Wiem nawet, że z polecenia php app/console container:debug mogę zobaczyć wszystkie moje usługi są dostępne, ale nie wiem, w jaki sposób można wziąć/wybrać właściwą

aktualizacji

Próbowałem dodać

arguments: [@mailer,@templating] 

ale mam ServiceCircularReferenceException

UPDATE

zmieniłem service.yml z

arguments: [@service_container] 

a nawet mojej służby

$email = $this->service_container->get('mailer'); 
$twig = $this->service_container->get('templating'); 

dla Mail Service wykorzystanie (SWIFT) i renderowania.

Nie sądzę, że to najlepsze rozwiązanie. Chciałabym wstrzykiwań Tylko mailer i templating

UPDATE Po odpowiedź Jasona Używam Symfony 2.3

mój services.yml

services: 
    EmailService: 
     class: %EmailService.class% 
     arguments: [@mailer,@templating,%EmailService.adminEmail%] 

Mam ten ServiceCircularReferenceException

Odpowiedz

23

Masz rację co do renderView(), jest to tylko skrót dla Kontrolerów. Korzystając z klasy usług i wstrzykując usługę szablonowania, wystarczy zmienić funkcję na render(). Więc zamiast

return $this->renderView('Hello/index.html.twig', array('name' => $name)); 

byłoby użyć

return $this->render('Hello/index.html.twig', array('name' => $name)); 

Aktualizacja Olivii odpowiedzi:

Jeśli otrzymujesz okrągłe błędy referencyjnych, jedynym sposobem wokół nich jest wstrzyknąć cały pojemnik . Nie jest to uważane za najlepszą praktykę, ale czasami nie można tego uniknąć. Kiedy muszę się do tego odwoływać, wciąż ustawiam zmienne klasowe w konstruktorze, dzięki czemu mogę działać tak, jakby zostały bezpośrednio wstrzyknięte.Tak zrobię:

use Symfony\Component\DependencyInjection\ContainerInterface; 

class MyClass() 
{ 
    private $mailer; 
    private $templating; 

    public function __construct(ContainerInterface $container) 
    { 
     $this->mailer = $container->get('mailer'); 
     $this->templating = $container->get('templating'); 
    } 
    // rest of class will use these services as if injected directly 
} 

marginesie, właśnie testowane własną usługę autonomicznego w Symfony 2.5 i nie otrzymał odwołanie cykliczne przez wstrzykiwanie bezpośrednio usługi mailera i szablonów.

+1

jest to jasne, ale jeśli I Wstrzykiwanie "[@ mailer, @ szablon]" muszę wstrzyknąć cały pojemnik. – monkeyUser

+0

Jakiego typu usługi tworzysz? Czy jest samodzielny, czy może jest słuchaczem innego wydarzenia? Nie powinieneś uzyskiwać okrągłego błędu referencyjnego za pomocą programu pocztowego i szablonów, chyba że słuchasz wydarzenia, które już je wstrzykuje. Zgaduję, że korzystasz z szablonów do renderowania szablonu używanego w wiadomości e-mail. –

+0

to prosta usługa, która tworzy pocztę e-mail i renderuje emailTemplate – monkeyUser

1

Korzystanie iniekcji zależność konstruktor (testowane z Symfony 3.4):

class MyService 
{ 
    private $mailer; 
    private $templating; 

    public function __construct(\Swift_Mailer $mailer, \Twig_Environment $templating) 
    { 
     $this->mailer  = $mailer; 
     $this->templating = $templating; 
    } 

    public function sendEmail() 
    { 
     $message = $this->templating->render('emails/registration.html.twig'); 

     // ... 
    } 
} 

ma potrzeby konfigurowania argumenty.