我在項目的不同位置使用了服務。在我的控制器中它完美地工作。如何讓服務在生命週期事件偵聽器中工作
我在prePersist生命週期事件偵聽器中需要它,但在那裏調用服務不想工作。當我嘗試它時,我得到以下錯誤;
試圖調用方法 「獲得」 上 類 「XX \的xxx \ XxxxBundle \ LIB \ yyyy年\ OrderUserListener」。
我認爲我明白我必須在我的事件監聽器中注入我的服務,但我不明白該怎麼做。
這就是OrderUserListener
和OrderLogger
服務分別在service.yml文件中的樣子;
bss.pmod.current_user_id:
class: Xx\Xxx\XxxxBundle\Lib\Yyyy\OrderUserListener
calls:
- [ setServiceContainer, [@service_container] ]
tags:
- { name: doctrine.event_listener, event: prePersist }
bss.pmod.order_logger:
class: Xx\Xxx\XxxxBundle\Lib\Yyyy\OrderLogger
arguments: [ "@doctrine.orm.entity_manager", "@security.token_storage" ]
這是我的OrderLogger函數,我想在我的服務中注入;
class OrderLogger {
private $em;
private $tokenStorage;
/**
* Constructor.
*
* @param EntityManager $em
* @param TokenStorage $securityTokenStorage
*/
public function __construct(EntityManager $em, TokenStorage $securityTokenStorage)
{
$this->em = $em;
$this->tokenStorage = $securityTokenStorage;
}
/**
* Log an order action.
*
* @param string $text
*/
public function log($order, $action)
{
$logRecord = new PmodLog();
if (is_object($this->tokenStorage->getToken())) {
$user = $this->tokenStorage->getToken()->getUser();
if (is_object($user)) {
$logRecord->setUser($user);
}
}
$logRecord->setOrder($order);
$logRecord->setAction($action);
$logRecord->setTime(new \DateTime());
$this->em->persist($logRecord);
$this->em->flush();
}
}
我的事件監聽器看起來像這樣;
class OrderUserListener
{
/**
* Service container
* @var type
*/
private $serviceContainer;
/**
* Performs tasks before destruction
* @ORM\PrePersist
*/
public function prePersist(LifecycleEventArgs $args)
{
$order = $args->getEntity();
if ($order instanceof PmodOrder) {
$user = $this->serviceContainer->get('security.token_storage')->getToken()->getUser();
if ($user) {
$order->setCreatedBy($user);
$order->setCreatedAt(new \DateTime(date('Y-m-d H:i:s')));
$order->setDepartment($user->getDepartment());
$order->setStatus(PmodOrder::STATUS_AWAITING_APPROVAL);
//$this->get('bss.pmod.order_logger')->log($order, 'Order Created'); // This is then clearly wrong.
}
}
}
/**
* Sets the sales order exporter object
* @param type $serviceContainer
*/
public function setServiceContainer($serviceContainer)
{
$this->serviceContainer = $serviceContainer;
}
}
如果有人可以向我解釋如何用我的示例做到這一點,我會非常感激它。
您可以提供您的'OrderUserListener'定義嗎?就像你對'OrderLogger'所做的那樣' –
你是指'OrderUserListener'的service.yml文件中的服務定義? – Mentos93
是的,你似乎需要將'bss.pmod.order_logger'作爲參數添加到它。 –