2016-07-07 185 views
1

我使用symfony和簡單的管理員,我想監聽事件easy_admin.pre_persistSymfony添加事件監聽器

在易於管理控制器,它調用此事件是這樣的:

$this->dispatch(EasyAdminEvents::PRE_PERSIST, array('entity' => $entity)); 

這consts:

/** @Event("Symfony\Component\EventDispatcher\GenericEvent") */ 
const PRE_PERSIST = 'easy_admin.pre_persist'; 

如果我在同一個控制器添加監聽此事件是這樣的:

$ed = $this->get('event_dispatcher'); 

    $ed->addListener('easy_admin.pre_persist', function($e) { 
     echo 'it works!'; 
     die(); 
    }); 

...它的工作原理。

但我想添加此監聽器在其他地方。我認爲services.yml將是它的好地方。我已閱讀Sf文檔,我應該添加這種方式的服務:

# app/config/services.yml 
services: 
    app.exception_listener: 
     class: AppBundle\EventListener\ExceptionListener 
     tags: 
      - { name: kernel.event_listener, event: kernel.exception } 

但有2個屬性 - 名稱和事件。我只知道活動名稱,easy_admin.pre_persist

它是如何工作的?什麼是name這個事件和什麼是event? 如果我可以添加監聽器easy_admin.pre_persist如何將此監聽器添加到services.yml?

回答

3

我給你一個非常簡單的例子,但你需要適應你的。它應該相當簡單。它只會給你一個公平的想法,而不是一個真實的例子。

更多的例子:http://www.inanzzz.com/index.php/posts/symfony

UserController.php

class UserController 
{ 
    .... 

    public function createAction() 
    { 
     $user = new User(); 
     $user->setUsername('username'); 
     $user->setPassword('password'); 

     $this->entityManager->persist($user); 
     $this->entityManager->flush(); 
    } 

    .... 
} 

Services.yml

services: 
    application_backend.listener.user_entity: 
     class: Application\BackendBundle\Listener\UserEntityListener 
     tags: 
       - { name: doctrine.event_listener, event: prePersist } 

UserControllerListener.php

namespace Application\BackendBundle\Listener; 

use Application\BackendBundle\Entity\User; 
use Doctrine\ORM\Event\LifecycleEventArgs; 

class UserEntityListener 
{ 
    public function prePersist(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 

     if ($entity instanceof User) { 
      // Do whatever you want 
     } 
    } 
} 
2

您需要知道偵聽器的類和要調用的方法的名稱。兩者都取決於簡單的管理(抱歉,從未使用過)。所以看爲易於管理的代碼

1

您可以在您張貼使用symfony的一般事件事件定義看,所以你要聽內核和標籤名稱屬性應該是kernel.event_listener

# app/config/services.yml 
services: 
    app.exception_listener: 
     class: YourBundle\EventListener\EasydminPrePersitListener 
     tags: 
      - { name: kernel.event_listener, event: easy_admin.pre_persist, method: onPrePersist } 

而且在Listener類中你定義了一個方法onPrePersist()