在自定义事件中使用自定义服务

时间:2014-12-11 10:12:59

标签: php symfony

我正在学习Symfony而我正在尝试创建:新服务和活动

我的服务发送电子邮件

config.yml

parameters:
    MyService.class:      Acme\UserBundle\Services\sendEmail
    MyService.transport:  sendmail

service.yml

services:
    MyService:
        class:        %MyService.class%
        arguments:    [@mailer]

sendEmail.php

class sendEmail {

    private $mail;

    public function __construct ($mail) {
        $this->mail = $mail;
    }

    public function sendMail () {
        $msg = \Swift_Message::newInstance()
            ->setSubject('Hi')
            ->setFrom('xxx@example.com')
            ->setTo('cc@gmail.com')
            ->setBody('ok');
        $this->mail->send($msg);
    }


} 

我的活动

我创建了这些类

UserEvent.php
    <?php
    namespace Acme\UserBundle\Event;


    final class UserEvents {

        const NEW_USER='new.user';


    } 

newUserEvent.php

<?php

/**
 * EVENT DISPATCHER
 */
namespace Acme\UserBundle\Event;

use Acme\UserBundle\Entity\User;
use Symfony\Component\EventDispatcher\Event;


class NewUserEvent extends Event {

    protected $user;

    public function __construct (User $user) {
        $this->user = $user;
    }

    public function getUser () {
        return $this->user;
    }
}

newUserListener.php

<?php

namespace Acme\UserBundle\Event;
use Acme\UserBundle\Services\sendEmail;    

class NewUserListener {

    public function sendEmailToUsers(NewUserEvent $event,sendEmail $service)
    {
        // ... send email to users
    }
} 

在我的控制器中

$em = $this->getEm();

        $dispatcher = new EventDispatcher();

        // attach listener
        $listner = new NewUserListener();
        $dispatcher->addListener(UserEvents::NEW_USER,array($listner,'sendEmailToUsers'));

        $user = $em->getRepository('AcmeUserBundle:User')->findOneBy(array('username' => 'alex')); //mock
        $event = new NewUserEvent($user,$this->get('MyService'));
        $dispatcher->dispatch(UserEvents::NEW_USER,$event);



        return new Response('hi');

我想在我的活动中使用我的服务,我有这个错误

  

ContextErrorException:Catchable Fatal Error:参数2传递给   Acme \ UserBundle \ Event \ NewUserListener :: sendEmailToUsers()必须是   Acme \ UserBundle \ Services \ sendEmail的实例,没有给出   极致/ UserBundle /活动/ NewUserListener.php

1 个答案:

答案 0 :(得分:1)

这里有很多要点:

  • 您在控制器中创建了一个新的事件调度程序,但事件调度程序服务已在标准Symfony应用程序中可用,您应该使用它并使用您的服务的kernel.event_listener标记注册您的侦听器:

http://symfony.com/doc/current/cookbook/service_container/event_listener.html

$disptacher = $this->container->get('event_dispatcher');
  • 其次,无论你在听众中注入你的服务吗?
相关问题