当谈到使用相同的会话时,我们选择的选项......不太理想,但它允许我们继续我们的计划而不妨碍使用任何一个应用程序。当前计划是在我们完成将应用程序代码迁移到 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);
}
}
}
}
我希望这有助于其他一些人允许他们从一个棘手的旧应用程序迁移到新的编码风格。希望确保随着时间的推移总结我们的发现,以确保其他人在未来不必看起来那么有希望。