首页 文章

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

提问于
浏览
0

我正在学习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:传递给Acme \ UserBundle \ Event \的参数2,NewUserListener :: sendEmailToUsers()必须是Acme \ UserBundle \ Services \ sendEmail的实例,在Acme / UserBundle / Event / NewUserListener.php中没有给出

1 回答

  • 1

    这里有很多要点:

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

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

    $disptacher = $this->container->get('event_dispatcher');
    
    • 其次,您无处在监听中注入您的服务?

相关问题