(我删除了以前的类似主题,因为代码中的更改太多了。)
我使用Symfony\Component\HttpFoundation\Session\Session
和Symfony\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
之前。
当我在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)
);
...
感谢任何提示。
答案 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();