2015-04-01 34 views
6

我想從我的定製服務訪問控制器方法。我創建了MyManager類,我需要在其中調用createForm()generateUrl()函數。在控制器中,我可以使用:$this->createForm(...)$this->generateUrl(...),但有什麼服務?有可能的?我真的需要這種方法!我應該使用什麼論據?在Symfony2中調用createForm()和generateUrl()服務

+0

您可以將您的控制器作爲參數傳遞給您的服務,然後調用$ controller-> createForm(...) – rogeriolino 2015-04-01 18:44:40

回答

20

如果你看看這兩個方法在Symfony\Bundle\FrameworkBundle\Controller\Controller類,你會看到服務名稱以及如何使用它們。

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

基本上,你需要一流的服務routerform.factory實現的功能。我不建議將控制器傳遞給你的班級。控制器是主要由框架本身使用的特殊類。如果您打算將您的課程用作服務,請創建它。

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

爲服務創建一個帶有兩個參數的構造函數,並在您的類中實現所需的方法。

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

這是解決此問題的最佳方法!我在你的回答之前來到了相同的地方,所以我們認爲一致:) – ZaquPL 2015-04-01 23:28:15

0

假設你注射服務到您的控制器,可以控制對象傳遞給您的服務功能

例如

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

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

這是一個糟糕的主意。你應該只注入你需要的實際服務,而不是注入控制器來使用'$ controller-> get()'方法。在最壞的情況下,你可以注入'@ service_container'然後使用它('$ this-> container-> get()'),但即使這樣也不是最佳實踐。 – qooplmao 2015-04-05 10:14:09

+0

@Qoop那麼你的解決方案是什麼? – wonde 2015-04-07 14:33:27

+0

與接受的答案相同。通過路由器和工廠到服務,或者正如我提到的使用服務容器,但不建議。 – qooplmao 2015-04-07 14:34:58