Использовать сеанс внутри пользовательских провайдеров услуг
Я разрабатываю настраиваемое поле для компонента 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());
...
});