Symfony 如何从继承控制器类的类中使用monolog

Symfony 如何从继承控制器类的类中使用monolog,symfony,dependency-injection,Symfony,Dependency Injection,我用的是独白 类内DefaultController扩展控制器 比如 $logger = $this->get('logger'); $logger->info('Get Started'); 我可以从继承控制器类的类中调用此->获取'logger'。 但是,我想使用其他类(如/Entity/User.php)中的logger 我怎样才能做到 我的推荐信是 由于关注点的分离,实体不应该依赖于服务。根据您的需要,明智的做法可能是使用控制器/服务中的记录器或任何调用您想

我用的是独白

类内DefaultController扩展控制器

比如

    $logger = $this->get('logger');
    $logger->info('Get Started');
我可以从继承控制器类的类中调用此->获取'logger'。 但是,我想使用其他类(如/Entity/User.php)中的logger 我怎样才能做到

我的推荐信是


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

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


这可能是个棘手的问题。但是,由于它是symfony的一个重要组成部分,因此您确实值得尝试了解这一点。

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

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


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

一般来说,您可以在容器未自动注入的类中访问记录器之类的服务,即控制器和命令,通过依赖项注入扩展ContainerWareCommand

可能的注入类型有属性注入、setter注入和构造函数注入。我的例子将包括。首先需要为类创建一个服务

假设yml配置,示例如下所示:

services:
    your_service:
        class:     Vendor/YourBundle/NonControllerExtendingClass
        arguments: ["@logger"]    # inject logger service into constructor
public function someAction()
{
    $this->logger->info('Im here');
}
在我的示例中,如果“logger”服务被称为服务,则它会自动注入到NonControllerExtendingClass中。确保您的供应商/YourBundle/NonControllerExtendingClass中有类似的内容:

use Symfony\Component\HttpKernel\Log\LoggerInterface;

// ...

public function __construct(LoggerInterface $logger)
{
   $this->logger = $logger;
}
现在,在您的方法中使用记录器,如下所示:

services:
    your_service:
        class:     Vendor/YourBundle/NonControllerExtendingClass
        arguments: ["@logger"]    # inject logger service into constructor
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); 
如果您希望使用记录器跟踪实体更改,则应使用条令事件侦听器或订阅服务器。
在文档一章中了解更多信息-。

通常,您可以在容器未自动注入的类中访问记录器之类的服务,即控制器和命令,通过使用依赖项注入扩展ContainerWareCommand

可能的注入类型有属性注入、setter注入和构造函数注入。我的例子将包括。首先需要为类创建一个服务

假设yml配置,示例如下所示:

services:
    your_service:
        class:     Vendor/YourBundle/NonControllerExtendingClass
        arguments: ["@logger"]    # inject logger service into constructor
public function someAction()
{
    $this->logger->info('Im here');
}
在我的示例中,如果“logger”服务被称为服务,则它会自动注入到NonControllerExtendingClass中。确保您的供应商/YourBundle/NonControllerExtendingClass中有类似的内容:

use Symfony\Component\HttpKernel\Log\LoggerInterface;

// ...

public function __construct(LoggerInterface $logger)
{
   $this->logger = $logger;
}
现在,在您的方法中使用记录器,如下所示:

services:
    your_service:
        class:     Vendor/YourBundle/NonControllerExtendingClass
        arguments: ["@logger"]    # inject logger service into constructor
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); 
如果您希望使用记录器跟踪实体更改,则应使用条令事件侦听器或订阅服务器。
有关详细信息,请参阅文档章节-。

对于symfony 3,请使用此记录器接口:Psr\Log\LoggerInterface对于symfony 3,请使用此记录器接口:Psr\Log\LoggerInterface