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 に答える