[英]Symfony2 Event Listener Issues
難以理解事件監聽器。 我的控制器中有以下操作
public function createAction(Request $request)
{
try {
$na_command = strtoupper($request->get('na_command'));
$na_is_connecting = $request->get('na_is_connecting');
// ==== validate (removed) ==== //
$em = $this->getDoctrine()->getManager();
$alert = new AvailabilityAlert();
$alert->setSearchCommand($na_command);
$alert->setIsConnecting($na_is_connecting);
$em->persist($alert);
$em->flush();
return new JsonResponse('Success');
}catch (Exception $e) {
}
}
我有一個普通表單(不是表單生成器),並且我從數據創建了一個警報並將其發送到我的數據庫。 如果成功,則將成功消息發送回我的ajax。
這是問題所在。 如果createAction成功,則需要它將警報發送到另一個類並對其進行處理。 因此,建議事件監聽器可以為我執行此操作。 所以我創建了一個監聽器來測試
<?php
namespace Nick\AlertBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
class AvailabilityAlertListener
{
public function prePersist(LifecycleEventArgs $args)
{
die('Something is being inserted!');
}
}
然后,我將其添加到services.yml
services:
doctrine.availability_alert_listener:
class: Nick\AlertBundle\EventListener\AvailabilityAlertListener
arguments: []
tags:
- { name: doctrine.event_listener, event: prePersist }
但是,如何使createAction偵聽此事件? 我有點迷茫,所以任何建議都值得贊賞。 本質上,在createAction結束時,我想做類似的事情
include 'uapi_cron_single.php';
AddFlightsAction($alert);
但是我不想像上面那樣做,因為它很亂。 但是,如果createAction成功,則需要將警報發送到另一個類,那么執行此操作的最佳方法是什么?
謝謝
首先,當您定義不帶參數的服務時,無需指定arguments: []
,您可以簡單地將其寫為
services:
doctrine.availability_alert_listener:
class: Nick\AlertBundle\EventListener\AvailabilityAlertListener
tags:
- { name: doctrine.event_listener, event: prePersist }
其次,您知道在實體持久之前會觸發事件嗎? 我想這不是您想要的(我想),因為您正在寫有關將對象插入數據庫后觸發事件的信息。 因此,您應該按以下方式修改服務定義
services:
doctrine.availability_alert_listener:
class: Nick\AlertBundle\EventListener\AvailabilityAlertListener
tags:
- { name: doctrine.event_listener, event: postPersist }
和你的服務等級
<?php
namespace Nick\AlertBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
class AvailabilityAlertListener
{
public function postPersist(LifecycleEventArgs $args)
{
die('Something is being inserted!');
}
}
但這還不是全部...
第三, 每次將對象持久化到db時, 無論對象具有哪種類型(類),都將引發此事件偵聽器。 當然,這不是您想要的。
僅檢查持久存在的“一種”對象良性的第一個解決方案是從LifecycleEventArgs
參數檢索實體,並使用instanceof檢查類的正確性
<?php
namespace Nick\AlertBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
class AvailabilityAlertListener
{
public function postPersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof \Your\Bundle\Path\To\AvailabilityAlert) {
/** do something **/
}
}
}
如果僅持久化此類對象,則還可以自行創建不遵循事件偵聽器/訂閱者背后邏輯的服務,並且一旦持久化AvailabilityAlert
對象,就可以通過調用其方法之一來執行某些操作。
返回您的問題
但是,如何使createAction偵聽此事件? 我有點迷茫,所以任何建議都值得贊賞。
現在您應該已經了解,在將對象持久存儲到數據庫之后,事件是“自動”觸發的。
我注意到你想做
include 'uapi_cron_single.php';
AddFlightsAction($alert);
我建議您調度自定義事件,然后創建自定義偵聽器。 在Symfony2文檔中,有一個很好的條目: http : //symfony.com/doc/current/components/event_dispatcher/introduction.html
如果我錯了,請糾正我,但是您創建的此偵聽器是DoctrineListener。 因此它將在任何實體prePersist事件上啟動。 因此,您需要確定所需的實體是否持久。 但我不確定100%。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.