如何使用继承Controller类的类中的monolog

时间:2013-05-30 10:41:57

标签: symfony dependency-injection

我正在使用monolog

类中的

DefaultController扩展了Controller

,例如

    $logger = $this->get('logger');
    $logger->info('Get Started');

我可以从继承Controller类的类中调用this-> get('logger')。 但是我想使用其他类的logger,例如/Entity/User.php 我该怎么做?

我的参考是

http://symfony.com/doc/2.0/cookbook/logging/monolog.html

2 个答案:

答案 0 :(得分:11)

通常,您可以使用依赖注入来访问未自动注入容器的类(例如,扩展ContainerAwareCommand的Controller和命令)中的记录器等服务。

可能的注入类型是property-,setter-和constructor注入。我的例子将涵盖constructor injection。您首先需要为您的班级创建服务

假设yml-configuration,示例可能如下所示:

services:
    your_service:
        class:     Vendor/YourBundle/NonControllerExtendingClass
        arguments: ["@logger"]    # inject logger service into constructor

在我的示例中,如果将“logger”服务作为服务调用,它将自动注入NonControllerExtendingClass。确保您的Vendor / YourBundle / NonControllerExtendingClass中有类似的内容:

use Symfony\Component\HttpKernel\Log\LoggerInterface;

// ...

public function __construct(LoggerInterface $logger)
{
   $this->logger = $logger;
}

现在在你的方法中使用这样的记录器:

public function someAction()
{
    $this->logger->info('Im here');
}

只有在您将类作为服务调用或手动注入记录器时,才会注入记录器。

// ... gets service from the container
$my_service = $this-container->get('your_service'); 

// ... manual injection
$logger = $this->container->get('logger'); 
// alternatively create a logger object yourself i.e. $logger = new Logger();

$my_service = new Vendor/YourBundle/NonControllerExtendingClass($logger); 

如果您想使用记录器跟踪实体更改,则应使用 Doctrine事件监听器订阅者。 请阅读文档章节中的相关内容 - How to Register Event Listeners and Subscribers

答案 1 :(得分:0)

由于关注点分离,实体不应该依赖服务。根据您的需要,使用来自控制器/服务的记录器或任何调用您要记录的实体方法的记录器可能是明智的。

一般来说,您可以将类定义为服务并将记录器注入该服务。如果您还不熟悉服务容器和依赖注入,我强烈建议您阅读文档的this chapter

这可能是一个棘手的主题。但是,由于它是symfony的重要组成部分,因此尝试理解这一点非常值得。