【问题标题】:Use custom Service inside Custom Event在自定义事件中使用自定义服务
【发布时间】:2014-12-11 10:12:59
【问题描述】:

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

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    这里有很多要点:

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

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

    $disptacher = $this->container->get('event_dispatcher');
    
    • 其次,您在侦听器中的任何地方都没有注入服务?

    【讨论】:

    • 感谢您的回复。我正在关注此文档symfony.com/doc/2.3/components/event_dispatcher/… 以创建事件。我必须使用 KernelEvents 吗?我怎样才能将我的服务注入我的听众?再次感谢
    • 您应该将您的侦听器声明为服务,并作为参数传递您的 sendEmail 服务。
    • 好的,我会尝试,我只需要修改我的监听器,因为我的 SendEmail 服务有效。然后,每当我想要在我的监听器中提供服务时,我必须将监听器创建为服务?谢谢
    • 是的,在全球范围内,您需要在某个地方定义要在您的侦听器中注入的内容。最佳做法是将侦听器作为服务。
    • 好的,但是我必须选择内核的哪个事件? api.symfony.com/2.3/Symfony/Component/HttpKernel/…。例如,我不想为每个请求调用我的侦听器,但只在 Persist new User 之后调用。再次感谢
    猜你喜欢
    • 2013-11-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    相关资源
    最近更新 更多