来自非控制器的 Symfony 独白 Class
Monolog in Symfony from non-controller Class
我有以下 class:
namespace AppBundle\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use FOS\UserBundle\Event\UserEvent;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
class UserRegistrationListener implements EventSubscriberInterface
{
protected $logger;
public function __construct($logger)
{
$this->logger = $logger;
}
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_INITIALIZE => 'onRegistrationInit',
);
}
/**
* take action when registration is initialized
* set the username to a unique id
* @param \FOS\UserBundle\Event\FormEvent $event
*/
public function onRegistrationInit(UserEvent $userevent)
{
$this->logger->info("Log Something");
$user = $userevent->getUser();
$user->setUsername(uniqid());
}
}
我已经尝试了几个小时来从其中记录一些带有独白的东西,但没有成功。
我已经阅读了很多文档,我相信我需要以某种方式 'Inject' 独白作为一种服务。然而,我读到的内容对我来说似乎并不清楚。
一些细节:
#config_dev.yml
monolog:
channels: [chris]
handlers:
mylog:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%_chris.log"
channels: chris
formatter: monolog.my_line_formatter
。
#services.yml
services:
monolog.my_line_formatter:
class: Monolog\Formatter\LineFormatter
arguments: [~, ~, true]
app.user_registration:
class: AppBundle\EventListener\UserRegistrationListener
arguments: [@logger] ## changed to [@monolog.logger.chris] to us custom channel
tags:
- { name: kernel.event_subscriber }
我需要做什么才能让 Monolog 在这个 class 中使用我的格式化程序?
更新:
@griotteau 我已经完成了你在答案中发布的内容,但我仍然收到错误消息:
CRITICAL - Uncaught PHP Exception Symfony\Component\Debug\Exception\ContextErrorException: "Warning: Missing argument 1 for AppBundle\EventListener\UserRegistrationListener::__construct(), called in ...filepath...\app\cache\dev\appDevDebugProjectContainer.php on line 384 and defined" at ...filepath...\src\AppBundle\EventListener\UserRegistrationListener.php line 18
已解决错误 我已经有一个具有相同 class 的服务(未在 ym 问题中显示)。 @griotteau 的回答是正确的。
您可以在声明服务时传递参数
在services.yml中:
app.user_registration:
class: AppBundle\EventListener\UserRegistrationListener
arguments: [@logger]
tags:
- { name: kernel.event_subscriber }
在你的 class 中添加一个构造函数 :
protected $logger;
public function __construct($logger)
{
$this->logger = $logger;
}
所以当你想添加日志时:
$this->logger->info(...);
我有以下 class:
namespace AppBundle\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use FOS\UserBundle\Event\UserEvent;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
class UserRegistrationListener implements EventSubscriberInterface
{
protected $logger;
public function __construct($logger)
{
$this->logger = $logger;
}
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_INITIALIZE => 'onRegistrationInit',
);
}
/**
* take action when registration is initialized
* set the username to a unique id
* @param \FOS\UserBundle\Event\FormEvent $event
*/
public function onRegistrationInit(UserEvent $userevent)
{
$this->logger->info("Log Something");
$user = $userevent->getUser();
$user->setUsername(uniqid());
}
}
我已经尝试了几个小时来从其中记录一些带有独白的东西,但没有成功。
我已经阅读了很多文档,我相信我需要以某种方式 'Inject' 独白作为一种服务。然而,我读到的内容对我来说似乎并不清楚。
一些细节:
#config_dev.yml
monolog:
channels: [chris]
handlers:
mylog:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%_chris.log"
channels: chris
formatter: monolog.my_line_formatter
。
#services.yml
services:
monolog.my_line_formatter:
class: Monolog\Formatter\LineFormatter
arguments: [~, ~, true]
app.user_registration:
class: AppBundle\EventListener\UserRegistrationListener
arguments: [@logger] ## changed to [@monolog.logger.chris] to us custom channel
tags:
- { name: kernel.event_subscriber }
我需要做什么才能让 Monolog 在这个 class 中使用我的格式化程序?
更新: @griotteau 我已经完成了你在答案中发布的内容,但我仍然收到错误消息:
CRITICAL - Uncaught PHP Exception Symfony\Component\Debug\Exception\ContextErrorException: "Warning: Missing argument 1 for AppBundle\EventListener\UserRegistrationListener::__construct(), called in ...filepath...\app\cache\dev\appDevDebugProjectContainer.php on line 384 and defined" at ...filepath...\src\AppBundle\EventListener\UserRegistrationListener.php line 18
已解决错误 我已经有一个具有相同 class 的服务(未在 ym 问题中显示)。 @griotteau 的回答是正确的。
您可以在声明服务时传递参数
在services.yml中:
app.user_registration:
class: AppBundle\EventListener\UserRegistrationListener
arguments: [@logger]
tags:
- { name: kernel.event_subscriber }
在你的 class 中添加一个构造函数 :
protected $logger;
public function __construct($logger)
{
$this->logger = $logger;
}
所以当你想添加日志时:
$this->logger->info(...);