簡體   English   中英

Symfony2事件監聽器問題

[英]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中,您應該使用自動加載命名空間來“包含”其他文件中的類。

我建議您調度自定義事件,然后創建自定義偵聽器。 在Symfony2文檔中,有一個很好的條目: http : //symfony.com/doc/current/components/event_dispatcher/introduction.html

如果我錯了,請糾正我,但是您創建的此偵聽器是DoctrineListener。 因此它將在任何實體prePersist事件上啟動。 因此,您需要確定所需的實體是否持久。 但我不確定100%。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM