使用silex应用会话桥接旧版应用会话

时间:2014-11-01 11:55:49

标签: php silex legacy-code sessionstorage

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

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

我们如何在silex中启动当前会话。 $ app-> register(new ServiceSessionProvider());

很抱歉由于缺少实际代码,今天晚些时候会在计算机上使用代码段进行编辑。

赞赏集成遗留会话的任何和所有帮助。

1 个答案:

答案 0 :(得分: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;
});

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

<?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);
            }
        }
    }
}

我希望这有助于其他人允许他们从旧应用程序迁移到新的编码风格,这是他们身边的刺。希望随着时间的推移总结我们的发现,以确保其他人希望将来不必看得太多。