2014-12-13 44 views
19

我是symfony世界的新人。 我想用我的服務中呈現,但我得到這個錯誤我的服務中的RenderView

調用未定義的方法的RenderView

我知道的RenderView是

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

快捷方式,但我不不知道我在服務中注射了什麼。我知道,即使是與php app/console container:debug命令我可以看到我提供的所有服務,但我不知道如何可以採取/選擇正確的

更新

我嘗試添加

arguments: [@mailer,@templating] 

但我得到了ServiceCircularReferenceException

UPDATE

我改變了我的service.yml與

arguments: [@service_container] 

,甚至我的服務

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

使用郵件服務(SWIFT)和渲染。

我不認爲這是最好的解決方案。我想只注射mailertemplating

UPDATE賈森的回答 我使用Symfony的2.3

我services.yml

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

我得到這個ServiceCircularReferenceException

回答

23

後你對renderView()是正確的,它只是控制器的一個快捷方式。在使用服務類並注入模板服務時,您只需將功能更改爲render()即可。因此,而不是

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

你會使用

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

更新從Olivia的迴應:

如果你正在循環引用錯誤,他們周圍的唯一方法是注入整個容器。這不是最佳做法,但有時無法避免。當我不得不求助於此時,我仍然在構造函數中設置我的類變量,這樣我就可以像直接注入一樣。所以,我會做:

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 
} 

側面說明,我只是測試我自己的獨立服務的Symfony 2.5並沒有通過直接注射郵件和模板服務中得到循環引用。

+1

這很明顯,但如果我注入'[@ mailer,@ templating]'我必須注入所有的容器。 – monkeyUser 2014-12-13 20:56:56

+0

你正在創建什麼類型的服務?它是獨立的還是它是另一個事件的傾聽者?除非您正在監聽已經注入這些​​事件的事件,否則您不應僅通過郵件程序和模板獲得循環引用錯誤。我猜你正在使用模板來渲染用於電子郵件的模板。 – 2014-12-13 20:59:24

+0

這是一個簡單的服務,可以創建電子郵件並呈現電子郵件模板 – monkeyUser 2014-12-13 21:02:04

1

使用構造函數依賴注入(與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'); 

     // ... 
    } 
} 

無需配置參數。