2016-06-09 65 views
0

对于Symfony 2.8,此代码$this->container为空。尝试使用ContainerAwareInterface时容器未设置

use Symfony\Component\DependencyInjection\ContainerAwareInterface; 
use Symfony\Component\DependencyInjection\ContainerAwareTrait; 

class EntrarYPreregistroFormSubscriber implements EventSubscriberInterface, ContainerAwareInterface 
{ 
    use ContainerAwareTrait; 

    public function preSetData(FormEvent $event) 
    { 
     $l = $this->container->get('logger'); 
     $l->notice('GOT LOGGER'); 
    } 

    .... 
} 

而且我EntrarYPreregistroFormSubscriber服务被配置为:

pmktconcursos.entrarypreregistro.form.subscriber: 
    class: PMKT\ConcursosBundle\EventListener\EntrarYPreregistroFormSubscriber 
    calls: 
     - [ setContainer,[ "@service_container" ] ] 

我得到异常的$l = $this->container->get('logger');

request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\FatalErrorException: "Error: Call to a member function get() on a non-object" at /Users/vmarquez/Proyectos/GrupoPMKT/Promoticket/current/dev/chedraui1607/chedraui1607/src/PMKT/ConcursosBundle/Form/EventListener/EntrarYPreregistroFormSubscriber.php line 30 {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 0): Error: Call to a member function get() on a non-object at /Users/vmarquez/Proyectos/GrupoPMKT/Promoticket/current/dev/chedraui1607/chedraui1607/src/PMKT/ConcursosBundle/Form/EventListener/EntrarYPreregistroFormSubscriber.php:30)"} 

我缺少的东西?

+1

为什么你不使用通常的方式来传递参数到服务?只需将容器定义为参数,并将其传递给构造函数? –

+0

这是我使用Denis的解决方案。即使如此,我很好奇我在做什么使用特质的问题。 – vmarquez

回答

1

您正在制作表单事件监听器,因此在您的表单类型中,您有类似于$builder->addEventSubscriber(new EntrarYPreregistroFormSubscriber());的内容,因此您可以看到,表单事件监听器与常规事件监听器略有不同。因为你是创建对象的人,所以你应该打电话给setContainer($serviceContainer)。要做到这一点,你应该在你的表单类型中有服务容器。要做到这一点,你应该通过它作为选项,同时在控制器中创建你的表格

// in controller 
$object = ...; 
$form = $this->createForm(new YourFormType(), $object, array('service_container' => $this->get('service_container'))); 

// in YourFormType 
$listener = new EntrarYPreregistroFormSubscriber(); 
$listener->setContainer($options['service_container']); 
$builder->addEventSubscriber($listener); 
... 
// in setDefaultOptions method 
public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     ... 
     'service_container' => null, 
    )); 
} 
+0

恩丹尼斯,这是我正在考虑的一个解决方案(另一个解决方案是服务配置中的特定服务,以及您在评论中获得的所需服务)。感谢您的推荐。我会用你从这个答案开始的理由给它一个深刻的思考,只是为了看看我是否能够提供更清晰的解决方案。 – vmarquez

+0

无论如何,如果你的第二个解决方案是从服务配置中删除调用并将其转换为参数,那么你需要在表单类型中使用新的EntrarYPreregistroFormSubscriber($ serviceContainer) –

相关问题