HttpFoundation Session独立组件和表单渲染器

时间:2019-02-17 12:42:24

标签: php symfony

(我删除了以前的类似主题,因为代码中的更改太多了。)

我使用Symfony\Component\HttpFoundation\Session\SessionSymfony\Component\HttpFoundation\Request,但没有所有框架。

我有简单的索引

$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

当我在index.php中使用$session = new Session(new PhpBridgeSessionStorage());时,不存在此问题。不幸的是,在这种情况下,下一个请求中的会话为空(这是逻辑,因为我禁用了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 :(得分:0)

解决方案

问题是因为要构建表单,我使用类FormBuilder对其他表单来说是抽象的,它是作为服务提供的。 在创建csrf令牌时,我需要会话实例。

我不能喜欢此类中的会话,因为它是在AppContainer中配置的。 所以最后我进行了从index.php开始的会话,然后尝试从SessionTokenStorage开始。它已引发错误。

现在在AppContainer中将会话作为公共服务创建。 我可以将同一实例设置为其他服务的参数,也可以通过$ appContainer-> get('sessions')添加到请求中。

一点点代码

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();