在FOSUserBundle事件中获取twilio实例

时间:2014-07-29 01:25:19

标签: symfony symfony-2.3

我正在尝试向通过Twilio在我的网站注册的用户发送短信,我收到了vresh / twilio-bundle,它运行正常。 我试图将twilio实例传递给事件,但我想我错过了一些东西,这就是我在做的事情:

在config.yml中,我设置了这样的服务:

services:
    registration.completed.listener:
        class: Jaguar\AloBundle\EventListener\RegistrationEventListener
        arguments:
            entityManager: ["@doctrine.orm.voipswitch_entity_manager", "vresh_twilio"]
        tags:
            - { name: kernel.event_subscriber, event: performOnRegistrationCompleted }

我已经宣布了twilio配置:

vresh_twilio:
    sid: 'xxx'
    authToken: 'xxx'
    version: '2010-04-01'
    retryAttempts: 3

然后,在我的方法中,我尝试获取实例:

public function performOnRegistrationCompleted(UserEvent $event) 
{
    $twilio = $event->get('vresh_twilio');
}

但它失败了......

对此有任何帮助吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

您的服务设置存在一些问题。

  1. 您实际上没有传递Twilio实例,因为服务名称前面没有@符号。 @vresh_twilio是一项服务,vresh_twilio只是一个字符串。

  2. 您传入的关联数组的键为entityManager,值也是一个数组,其值为服务@doctrine.orm.voipswitch_entity_manager和字符串vresh_twilio

  3. 如果您在构造函数中使用Twilio实例构建侦听器,则不会传递Twilio实例。

  4. 您的服务实际上应该是......

    services:
        registration.completed.listener:
            class: Jaguar\AloBundle\EventListener\RegistrationEventListener
            arguments:
                entityManager: "@doctrine.orm.voipswitch_entity_manager"
                twilio: "@vresh_twilio"
                // Or
                // - @doctrine.orm.voipswitch_entity_manager
                // - @vresh_twilio
                // Or
                // [@doctrine.orm.voipswitch_entity_manager, @vresh_twilio]
                //
                // As they all mean the same thing and the keys aren't
                // used in your actual service __construct
            tags:
                - { name: kernel.event_subscriber, event: performOnRegistrationCompleted }
    

    这意味着你的监听器会有一个构造函数来接收像..

    这样的服务
    protected $entityManager;
    protected $twilio;
    
    public function __conctruct(ObjectManager $entityManager, TwilioWrapper $twilio)
    {
        $this->entityManager = $entityManager;
        $this->twilio = $twilio;
    }
    

    这意味着您可以使用$this->twilio在课堂上调用它。

    此外,通过查看services that the Vresh\TwilioBundle创建它看起来像您要注入的服务将是@twilio.api而不是@vresh_twilio,因为它似乎不存在但是我可能错了(我自己没有使用过这个包)。