1

我正在为 Silex 中的表单组件开发一个自定义字段。此字段的目的是呈现和验证验证码图像/值。

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

这是我得到的错误:

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

下面是我如何注册我的 FormExtension 以及它如何实例化自定义字段类型:

$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)
        );
    }
}
4

1 回答 1

1

所以我已经弄清楚问题所在了。
错误消息实际上是不言自明的。

实际上,我没有在调用之前使用会话,CaptchaType所以它只在那个时候开始,正如错误消息所说,为时已晚。

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

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

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

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

    ...

});
于 2012-09-14T08:29:26.587 回答