2015-04-01 7 views
6

Vorrei avere accesso ai metodi del controller dal mio servizio personalizzato. Ho creato la classe MyManager e ho bisogno di chiamare al suo interno le funzioni createForm() e generateUrl(). Nel controller posso usare: $this->createForm(...) e $this->generateUrl(...), ma con il servizio? È possibile? Ho davvero bisogno di questi metodi! Quali argomenti dovrei usare?Chiama createForm() e generateUrl() dal servizio in Symfony2

+0

È possibile passare il controller al servizio come parametro, quindi chiamare $ Controller-> createForm (...) – rogeriolino

risposta

20

Se si guarda a questi due metodi in Symfony\Bundle\FrameworkBundle\Controller\Controller di classe, si vedrà nome dei servizi e come usarli.

public function generateUrl($route, $parameters = array(), $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH) 
{ 
    return $this->container->get('router')->generate($route, $parameters, $referenceType); 
} 

public function createForm($type, $data = null, array $options = array()) 
{ 
    return $this->container->get('form.factory')->create($type, $data, $options); 
} 

In sostanza, si classe bisogno di servizi router e form.factory per implementare la funzionalità. Non è consigliabile passare il controller alla classe. I controller sono classi speciali che vengono utilizzate principalmente dal framework stesso. Se prevedi di utilizzare la tua classe come servizio, creala.

services: 
    my_manager: 
     class: Something\MyManager 
     arguments: [@router, @form.factory] 

Creare un costruttore con due argomenti per i servizi e implementare i metodi richiesti nella classe.

class MyManager 
{ 
    private $router; 
    private $formFactory; 

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

    // example method - same as in controller 
    public function createForm($type, $data = null, array $options = array()) 
    { 
     return $this->formFactory->create($type, $data, $options); 
    } 

    // the rest of you class ... 
} 
+0

E questo è il modo migliore per risolvere questo problema! Sono arrivato allo stesso prima della tua risposta, quindi pensiamo allo stesso modo :) – ZaquPL

0

supponendo che si sta iniettando il servizio nel controller, è possibile passare l'oggetto controller alla funzione di servizio

esempio

class myService 
{ 
    public function doSomthing($controller,$otherArgs) 
    { 
     $controller->generateForm(); 
    } 
} 

class Mycontroller extends Controller 
{ 
    public function indexAction() 
    { 
     $this->get("my-service")->doSomthing($this,"hello"); 
    } 
} 
+0

Questa è una pessima idea. Dovresti semplicemente iniettare il servizio effettivo di cui hai bisogno piuttosto che iniettare il controller solo per usare il metodo '$ controller-> get()'. Nel peggiore dei casi è possibile iniettare il '@ service_container' e quindi usarlo (' $ this-> container-> get() ') ma anche quella non è la migliore pratica. – qooplmao

+0

@Qoop quindi qual è la soluzione? – wonde

+0

Lo stesso della risposta accettata. Passare nel router e compilare la fabbrica per il servizio o, come già detto, utilizzare il contenitore dei servizi ma non è consigliato. – qooplmao

Problemi correlati