Использовать сеанс внутри пользовательских провайдеров услуг

Я разрабатываю настраиваемое поле для компонента Forms в 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)
        );
    }
}

1 ответ

Решение

Итак, я понял, в чем проблема.
Сообщение об ошибке на самом деле было в значительной степени самоочевидным.

На самом деле я не использую сеанс до звонков в CaptchaType поэтому он запускается только в этот момент, что, как говорится в сообщении об ошибке, слишком поздно.

Решение, которое я нашел, заключается в том, чтобы явно начать сеанс в начале действия моего контроллера. Затем я могу использовать сеанс внутри пользовательского типа формы, как я хочу.

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

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

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

    ...

});
Другие вопросы по тегам