2012-01-21 6 views
5

Ho una classe normale nel mio progetto Symfony2:Servizi di accesso all'interno di una classe normale

class RangeColumn extends Column{ 
     //... 
    } 

Ora all'interno di questa classe è una funzione di rendering, in cui mi piacerebbe usare Twig o il servizio di traduzione di Symfony2 per rendere un modello specifico. Come posso accedere a questi servizi in modo corretto?

risposta

10

Utilizzare dependency injection. È un concetto davvero semplice.

Dovresti semplicemente passare (iniettare) i servizi necessari alla tua classe.

Se le dipendenze sono obbligatorie passarle in un costruttore . Se sono opzionale utilizzare setter.

È possibile andare oltre e delegare la costruzione della classe al contenitore di dipendenze dell'iniezione (creare un servizio da questo).

I servizi non sono diversi dalla tua classe "normale". È solo che la loro costruzione è delegata al container.

11

Codice esempio:

<?php 

class MyRegularClass 
{ 
    private $translator; 

    public function __construct(Translator $translator) 
    { 
     $this->translator = $translator; 
    } 

    public function myFunction() 
    { 
     $this->translator->trans('sentence_to_translate'); 
    } 
} 

E se si desidera che la classe per diventare un servizio: Nel file services.yml situato nel vostro pacco,

parameters: 
    my_regular_class.class: Vendor\MyBundle\Classes\MyRegularClass 

services: 
    mybundle.classes.my_regular_class: 
     class: %my_regular_class.class% 
     arguments: [@translator] 

Per maggiori dettagli, vedere la capitolo su Symfony2 Service Container

+2

Il tag di immissione delle dipendenze è '@ translator.default' di Symfony 2.6, il tag' @ translator' fa riferimento a LoggingTranslator ora. – Lashae

Problemi correlati