Symfony依赖注入服务

时间:2017-05-10 03:10:41

标签: symfony-3.2

尝试创建将信息记录到数据库的服务。该服务必须在构造函数中调用Doctrine \ ORM \ EntityManager,但我一直收到此错误:

Catchable Fatal Error: Argument 1 passed to AppBundle\Service\EmailLoggerManager::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in /Users/augustwhitlock/Desktop/symfony/SymfonyRepositories/forms/src/AppBundle/Controller/DefaultController.php on line 45 and defined

以下是我在服务文件中的内容

namespace AppBundle\Service;

use Doctrine\ORM\EntityManager;
use AppBundle\Entity\Logger;

class EmailLoggerManager 
{

private $em;

public function __construct(EntityManager $em) 
{
    $this->em = $em;
}

public function logMessageToDatabase($type, $message, $date) 
{

    $logger = new Logger();
    $logger->setMessageType = $type;
    $logger->setMessageText = $message;
    $logger->setMessageDate = $date;

    $this->em->persist($logger);
    $this->em->flush();

}

这就是我如何处理EntityManager的注入。

 app.email_logger_manager:
    class: AppBundle\Services\EmailLoggerManager
    arguments: ['@doctrine.orm.entity_manager']

此时我只是在学习服务并尝试不同的事情。但这并不想工作。

这是DefaultController的编辑。我添加了第45和46行。除了类定义之外,没有任何内容。

    $emailLoggerManager = new EmailLoggerManager();
    $emailLoggerManager->logMessageToDatabase('Info', 'Hiya', new \DateTime());

    return new Response('Message Logged');

该类背后的整个概念是在服务中使用doctrine来将事物记录到数据库中,从而使我的控制器不必被所有代码堵塞。

1 个答案:

答案 0 :(得分:0)

您应该按照以下方式从控制器调用服务:

$this->get('app.email_logger_manager')
    ->logMessageToDatabase('Info', 'Hiya', new \DateTime());

而不是直接在控制器中实例化类。

此外,建议传递“@doctrine”服务而不是@ doctrine.orm.entity_manager,因为EntityManager可能会被关闭。 构造函数必须接收Doctrine \ Bundle \ DoctrineBundle \ Registry而不是Doctrine \ ORM \ EntityManager