2017-06-01 60 views
-1

您好我有小问题与Symfony2的依赖注入的服务,我找不出什么wrong.I遵循了http://symfony.com/doc/current/service_container/injection_types.html例子。也许有人重新审视可以排序了这一点和代码(顺便说一句,我不想​​延长控制器或通过这作为参数传递给类的构造函数):Symfony的2.8 dependecy注入问题

services: 

    app.custom_mailer: 
     class:  NTPBundle\Mailer\CustomMailer 
     arguments: ['@mailer'] 

CustomMailer.php

namespace NTPBundle\Mailer; 
class CustomMailer { 

private $mailer; 
public function __construct(MailerInterface $mailer) 
{ 
    $this->mailer = $mailer; 
} 


public function weekExtractMail() { 

    $message = \Swift_Message::newInstance() 
      ->setSubject('Hello Email') 
      ->setFrom('[email protected]') 
      ->setTo('[email protected]') 
      ->setBody("Test" 
    ); 
    $this->mailer->send($message); 
    return $this; 
} 

}

和PDFTestController.php

namespace NTPBundle\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use \Symfony\Component\HttpFoundation\Response; 
class PDFTestController extends Controller{ 
    /** 
    * @Route("/pdftest") 
    */ 
    public function pdfTestAction() { 
     $mailer=new \NTPBundle\Mailer\CustomMailer; 
     $mailer->weekExtractMail(); 
     return new response($this->renderView('NTPBundle:PDFReports:weekVolumes.html.twig', array())); 
    } 
} 

和错误

可捕获的致命错误:传递给NTPBundle \ Mailer \ CustomMailer :: __ construct()的参数1必须是NTPBundle \ Mailer \ MailerInterface的一个实例,在C:\ wamp64 \ www \ src \ NTPBundle \控制器\ PDFTestController.php第19行和定义

我都对着调试容器和定义的服务。

+0

*我在调试容器已经看过,并定义的服务。* - 那么用它代替实例自己。 – ccKep

回答

3

的问题看起来是你定义一个服务,但是如果使用新的实例化的服务。要允许为symfony1.2做了的事情(和实际注入的依赖关系),你需要的symfony使用service container最有可能来实例化服务:

$mailer = $container->get('app.custom_mailer'); 

编辑:在一个控制器,你可以只使用$this->get因为symfony做了它简单的别名。

+0

目的本消费的是使用依赖注入应该住在外面控制器,因此也对容器没有进入,但实际上你可能是正确的,而不是创建新的对象'$邮件=新\ NTPBundle \梅勒\ CustomMailer和;'我应该叫'CustomMailer :: weekExtractMail();'我会测试一下,确认 – Michal

+0

你不需要控制器,你需要symfony的服务容器来执行依赖注入。我刚才说控制器有一个快捷方式来获取容器类作为您使用服务的常见位置。 –

+0

这个答案是完全正确的,不需要测试任何不同的东西。它甚至在你的链接symfony文档的顶部说,它与服务容器有关。另外:*“实际上你可能是对的,而不是创建新的对象[...]我应该调用CustomMailer :: weekExtractMail();我会测试今天下午并确认”* - 如何将该方法调用为静态突然让'$ this-> mailer'可用(heck,你甚至没有'$ this'在静态调用中......)?你总是猜测?长话短说:您**需要**服务容器才能获得CustomMailer的实例。 – ccKep