2015-04-01 16 views
6

Chciałbym mieć dostęp do metod kontrolera z mojej usługi niestandardowej. Stworzyłem klasę MyManager i muszę do niej zadzwonić funkcje createForm() i generateUrl(). W kontrolerze mogę używać: $this->createForm(...) i $this->generateUrl(...), ale co z obsługą? To jest możliwe? Naprawdę potrzebuję tych metod! Jakich argumentów powinienem użyć?Zadzwoń do createForm() i generateUrl() z usługi w Symfony2

+0

Możesz przekazać kontroler do swojej usługi jako parametr, a następnie wywołać $ controller-> createForm (...) – rogeriolino

Odpowiedz

20

Jeśli spojrzeć na tych dwóch metod w Symfony\Bundle\FrameworkBundle\Controller\Controller klasy, widać nazwa usługi i jak z nich korzystać.

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); 
} 

Zasadniczo, klasa potrzebują usług router i form.factory za wdrożenie funkcjonalności. Nie polecam przekazywania kontrolera do twojej klasy. Kontrolery są klasami specjalnymi, które są używane głównie przez samą strukturę. Jeśli planujesz używać swojej klasy jako usługi, po prostu ją stwórz.

Utwórz konstruktor z dwoma argumentami dla usług i zaimplementuj wymagane metody w klasie.

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

I to jest najlepszy sposób na rozwiązanie tego problemu! Doszedłem do tego samego przed twoją odpowiedzią, więc myślimy podobnie :) – ZaquPL

0

zakładając, że wstrzykiwanie usługę do kontrolera można przekazać obiekt kontrolera do funkcji serwisowej

przykład

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

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

To jest okropny pomysł. Powinieneś po prostu wstrzyknąć rzeczywistą usługę, której potrzebujesz, zamiast wstrzykiwać kontroler tylko po to, aby użyć metody '$ controller-> get()'. W najgorszym wypadku możesz wstrzyknąć '@ service_container', a następnie użyć tego (' $ this-> container-> get() '), ale nawet to nie jest najlepsza praktyka. – qooplmao

+0

@Qoop, jakie jest twoje rozwiązanie? – wonde

+0

To samo, co w zaakceptowanej odpowiedzi. Przekaż router i utwórz fabrykę usługi lub, jak wspomniałem, użyj kontenera usług, ale nie jest to zalecane. – qooplmao

Powiązane problemy