HttpFoundation Session автономный компонент и средство визуализации форм - PullRequest
0 голосов
/ 17 февраля 2019

(я удалил предыдущую похожую тему, потому что в коде было слишком много изменений).

Я использую Symfony\Component\HttpFoundation\Session\Session и Symfony\Component\HttpFoundation\Request, но без всех рамок.

У меня простойindex

$request = Request::createFromGlobals();
$session = new Session();
if(!$session->isStarted()){
    $session->start();    
}
$request->setSession($session);
$kernel = new Kernel(new AppContainer());
$response = $kernel->handle($request);
$response->send();

хорошо работает, когда я использую только шаблоны веточек.Когда я использую любой класс, который реализует FormRendererInterface, это выдает мне ошибку.Я ожидаю, что к CsrfTokenManager.

enter image description here

Эта проблема не возникает, когда я использую $session = new Session(new PhpBridgeSessionStorage()); в index.php.К сожалению, в таких случаях сеансы в следующем запросе пусты (это логика, потому что я автоматически отключаю сеансы в php.inii).

Ниже приведен код, который я использую в контроллере для использования построителя форм.

...    
$form = (new LoginForm($this->formBuilder))->getForm($this->generateUrl('login'));
            $form->handleRequest($request);
            Match::val($form->isSubmitted() && $form->isValid())
            ->of(
                When::equals(true, function($item) use ($form){
                    $this->commandBus->dispatch(new UserLogin($form->getData()));
                }),
                When::other(false)            
            );
...

Спасибо за любые подсказки.

1 Ответ

0 голосов
/ 17 февраля 2019

РЕШЕНИЕ

Проблемы заключались в том, что для построения формы я использую класс FormBuilder, который является абстрактным для других форм, и он был предоставлен как сервис.Создается токен csrf, и для этого мне нужен экземпляр сеанса.

Я не смог найти сеансы в этом классе, потому что он был настроен в AppContainer.Итак, наконец, у меня был сеанс, который был запущен в index.php, и следующая попытка запустить в SessionTokenStorageБыло выдано сообщение об ошибке.

Теперь сеанс создается в AppContainer как публичная служба.Я могу установить тот же экземпляр в качестве параметра для других служб, а также добавить в запрос $ appContainer-> get ('session').

Немного кода

services.yaml

  ...
  sessions: 
    class: Symfony\Component\HttpFoundation\Session\Session
    arguments: []
    public: true
  form.builder:
    class: Iaso\Web\Component\Form\FormBuilder
    arguments: ['@twig','@config.loader', '@sessions']
    public: true

index.php

<?php
...
$request = Request::createFromGlobals();
$appContainer = new AppContainer();

$session = $appContainer->get('sessions');

if(!$session->isStarted()){
    $session->start();    
}
$request->setSession($session);

$kernel = new Kernel($appContainer);
$response = $kernel->handle($request);
$response->send();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...