2

我试图将遗留应用程序包装在 silex 中,方法是将其放置在 web 文件夹中,并在请求更新时用新的基于控制器的 silex 代码慢慢替换部分。旧的应用程序是一个扁平的 php,没有基于控制器的应用程序,在接下来的 16 个月内没有预算用于完全重写的时间。将遗留的平面代码放在 web 文件夹中具有预期的效果,如果找到文件,路由不会生效。我现在需要帮助的是配置​​ silex 以使用其他代码使用的 php 会话,反之亦然。

我发现这篇 Symfony 帖子似乎表明了我想做的一种方式,但是这些示例的结构与我们的 silex 设置的配置方式不同。http://symfony.com/doc/current/cookbook/session/php_bridge.html

我们如何在 silex 中开始会话。$ app-> register(new ServiceSessionProvider());

抱歉缺少实际代码,今天晚些时候回到计算机时将使用代码片段进行编辑。

感谢您在集成遗留会话方面的任何和所有帮助。

4

1 回答 1

1

当谈到使用相同的会话时,我们选择的选项......不太理想,但它允许我们继续我们的计划而不妨碍使用任何一个应用程序。当前计划是在我们完成将应用程序代码迁移到 Silex 后实施数据库存储会话。

我们选择了在这篇文章Symfony session Avoid _sf2_attributes中首次确定的选项。这是一个非常丑陋的解决方案,但允许我们在尝试以最少的前期工作及时迁移应用程序时所需的灵活性。目标是将其完全迁移到新的 Silex 应用程序,但这样做的时间框架是一年多或更长时间。

这是在我们的 Silex 应用程序中配置会话的方式。它使用基于文件的存储。

$app->register(new Silex\Provider\SessionServiceProvider(), array(
  'cookie_lifetime' => 86400,
));
$app['session.storage'] = $app->share(function () use ($app) {
  return new \Symfony\Component\HttpFoundation\Session\Storage\LegacySessionStorage;
});

这是最初位于此处的控制器代码的副本,以防它在某些时候被删除。

<?php

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

/**
 * Session sotrage that avoids using _sf2_attributes subkey
 * in the $_SESSION superglobal but instead it uses
 * the root variable.
 */
class LegacySessionStorage extends NativeSessionStorage 
{
const SYMFONY_SESSION_SUBKEY = '_sf2_attributes';

/**
 * @inheritdoc
 */
    protected function loadSession(array &$session = null)
    {
        if (null === $session) {
            $session = &$_SESSION;
        }

        parent::loadSession($session);

        foreach ($this->bags as $bag) {
            $key = $bag->getStorageKey();

            if (self::SYMFONY_SESSION_SUBKEY === $key)
            {
                $bag->initialize($session);
            }
        }
    }
}

我希望这有助于其他一些人允许他们从一个棘手的旧应用程序迁移到新的编码风格。希望确保随着时间的推移总结我们的发现,以确保其他人在未来不必看起来那么有希望。

于 2014-11-04T19:26:16.997 回答