Symfony 表单无法启动会话:已由 PHP 启动

问题描述 投票:0回答:2

我收到错误无法启动会话:已由 PHP 启动。将表单视图发送到 Twig 时。我不知道为什么,我想知道。

行动

public function indexAction(Request $request) {

    $em = $this->getDoctrine()->getManager();

    $uploadFormType = new \phpUploadFileTest\phpUploadFileTestBundle\Form\UploadType();
    $uploadEntity= new \phpUploadFileTest\phpUploadFileTestBundle\Entity\Upload();
    $uploadForm = $this->createForm($uploadFormType, $uploadEntity );
    $uploadForm->handleRequest($request);


    if($uploadForm->isSubmitted() && $uploadForm->isValid()){



        $em->persist($uploadEntity);
        $em->flush();


    }
    return $this->render("phpUploadFileTestphpUploadFileTestBundle::index.html.twig", array("uploadForm" => $uploadForm->createView()));

}

该代码发生错误

$uploadForm->createView()
。当我删除它时,我没有收到该错误。

\phpUploadFileTest\phpUploadFileTestBundle\Form\UploadType->buildForm 代码:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name', "text",[])->add('file', "text",[]);
}

当我在表单上禁用 CSRF 并设置“csrf_protection”=> false 时,该错误已修复。但我不想禁用 csrf 保护。

我不知道会话管理。但是从

vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php at line 132
抛出的错误:

if (PHP_VERSION_ID >= 50400 && \PHP_SESSION_ACTIVE === session_status()) {
        throw new \RuntimeException('Failed to start the session: already started by PHP.');
    }

来自 /home/guervyl/NetBeansProjects/gvwb/website-creator-symfony/vendor/symfony/symfony/src/Symfony/Component/Security/Csrf/TokenStorage/SessionTokenStorage.php 第 90 行:

public function hasToken($tokenId)
{
    if (!$this->session->isStarted()) {
        **$this->session->start();**
    }
    return $this->session->has($this->namespace.'/'.$tokenId);

我创建了一个自定义的app_dev.php。我在其中开始了一个会话。我使用了 legacy sessionsession,但我仍然收到该错误。

use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\PhpBridgeSessionStorage;

// legacy application configures session
ini_set('session.save_handler', 'files');
ini_set('session.save_path', '/tmp');
session_start();

// Get Symfony to interface with this existing session
$session = new Session(new PhpBridgeSessionStorage());
$session->start();

...
$session->set(...);
...
$session->has(...);
...
$session->get(...);

我的 Symfony 版本是 2.8.20(我知道它很旧

php symfony symfony-2.8
2个回答
2
投票

我通过将

storage_id: session.storage.php_bridge
添加到我的 config.yml 中来修复它:

framework:
    session: { handler_id: null, storage_id: session.storage.php_bridge}

然后在我的 php 文件中我使用 Symfony Session 类:

use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\PhpBridgeSessionStorage;

// legacy application configures session
ini_set('session.save_handler', 'files');
ini_set('session.save_path', '/tmp');
session_start();

// Get Symfony to interface with this existing session
$session = new Session(new PhpBridgeSessionStorage());
$session->start();

...
$session->set(...);
...
$session->has(...);
...
$session->get(...);

那里然后那里


0
投票

Symfony 会话与 php.ini 指令不兼容 session.auto_start = 1 该指令必须在 php.ini、Web 服务器指令或 .htaccess 中禁用。 摘自:https://symfony.com/doc/current/session.html

此问题的快速解决方案是:

  1. 转到保存 PHP 的路径。
  2. 打开 php.ini
  3. 找到session.auto_start
  4. 将值 1 更改为 0
  5. 重新启动您的 Symphony 应用程序

我不确定这个解决方案是否对每个人都有效,但请尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.