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