1

我正在使用独白

在类 DefaultController 中扩展了 Controller

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

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

我的参考是

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

4

2 回答 2

11

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

可能的注入类型是属性注入、设置注入和构造注入。我的示例将涵盖构造函数注入。您首先需要为您的班级创建服务

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

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

在我的示例中,如果将“记录器”服务作为服务调用,它会自动注入到 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 Event ListenerSubscriber。在文档章节中阅读有关它的更多信息 -如何注册事件侦听器和订阅者

于 2013-05-30T11:52:45.013 回答
0

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

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

这可能是一个难以掌握的主题。然而,因为它是 symfony 的一个重要组成部分,所以真的值得你花时间去尝试理解这一点。

于 2013-05-30T10:54:40.647 回答