2012-09-11 44 views
1

我正在为Silex中的Forms组件开发自定义字段。此字段的目的是呈现和验证验证码图像/值。在自定义服务提供程序中使用会话

我能够添加一个FormExtension来注册我的自定义类型。
我正在注入$app['session']以便能够在会话中存储验证码值。一切似乎按预期工作,直到我开始接触会议。

这是我得到的错误:

Failed to start the session because headers have already been sent. 

下文是我如何注册我的FormExtension以及它如何instanciates自定义字段类型:

$app->register(new FormServiceProvider()); 
$app['form.extensions'] = $app->share(
    $app->extend('form.extensions', function ($extensions) use ($app) { 
     $extensions[] = new CaptchaFormExtension($app['captcha.options'], $app['session']); 
     return $extensions; 
    }) 
); 

class CaptchaFormExtension extends AbstractExtension 
{ 
    private $session; 
    private $options; 

    public function __construct($options = array(), Session $session) 
    { 
     $this->options = $options; 
     $this->session = $session; 
    } 

    protected function loadTypes() 
    { 
     return array(
      new CaptchaType($this->options, $this->session) 
     ); 
    } 
} 

回答

1

所以我想通了什么问题了。
错误信息实际上非常明了。

其实我在CaptchaType之前不会使用会话,所以它只能在那个时候开始,就像错误信息所说的那样,太迟了。

解决方案我想出的是在我的控制器动作开始时显式启动会话。然后,我可以根据需要使用自定义表单类型中的会话。

$app->get('/contact', function() use ($app) { 

    $app['session']->start(); 

    $form = $app['form.factory']->create(new ContactFormType(), new ContactMessage()); 

    ... 

}); 
+0

谢谢。这有很大帮助。我使用PDO会话,安全组件中的某些内容试图启动NativeFileSession。我刚刚在应用程序开始时开始会话。 – lucian303

相关问题