2016-07-07 145 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()