我正在集成一个遗留的 Zend Framework 1 (ZF1) 应用程序和一个 Symfony 3.2.6 (SF) 应用程序。简而言之,它的工作原理是:
- 会话管理、登录页面(唯一入口点)和很多东西都由 ZF1 应用程序和 ZF1 本身管理
- 没有从 SF 端调用任何 Zend 控制器、模板、助手或任何其他
例如: - http://localhost/login
=> 将由 ZF1 管理 - http://localhost/sf/quote
=> 将由 SF 管理(关键是/sf/
URL 中的)
这意味着我在 Apache VH 中有一条规则说:每个带有/sf/*
URL 的请求都将app.php|app_dev.php
其发送到 Symfony,否则它将绕过此规则并直接转到 ZF1。
我要做的第一件事是使用旧版 ZF1 应用程序登录应用程序。成功登录后,我重定向到仪表板,使用以下代码NavigationController.php
从布局中调用a :main.phtml
$this->action('buildallmenu', 'navigation');
在这样的代码中,菜单是从数据库生成的,然后使用下面的代码我试图缓存它,因为我不需要而且我不想再次从 ZF1 或 SF 访问数据库。
use Predis\Client;
use Symfony\Component\Cache\Adapter\RedisAdapter;
$cached_items = [
'main_nav' => $main_nav,
'sub_nav' => $sub_nav,
'footer_nav' => $footer_nav,
'view_as' => $view_as,
];
$redisConnection = new Client('tcp://cache_server:6379');
$cache = new RedisAdapter($redisConnection);
$menu = $cache->getItem('mmi_menus_'.session_id());
if (!$menu->isHit()) {
$menu->set($cached_items);
$cache->save($menu);
}
return $menu->get();
为什么session_id()
因为每个用户的菜单是“唯一的”session_id()
,所以将其附加到 Redis 缓存项是有意义的。
从那里我看到$cached_items
var 填充了正确的内容,并将其保存到 Redis。
现在我访问 Symfony 控制器的方式就是我之前解释的方式:“通过访问 URL”。假设我将 URL 称为:http://localhost/sf/quote
这将执行规则并重定向到app_dev.php
这意味着我现在在 Symfony 上。
我做的第一件事是检查session_id()
(打印session_id()
值)并与 ZF1 创建的值进行比较,它们匹配。
SF 基本模板将控制器称为:{{ render(controller('CommonBundle:Setup:GenerateMenuItems')) }}
. 这是从模板调用的函数的内容:
public function GenerateMenuItemsAction()
{
$menu = $this->get('mmi_pool')->getItem('mmi_menus_'.session_id());
dump('mmi_menus_'.session_id());
if ($menu->isHit()) {
return $this->render(
'CommonBundle:Layout:menu.html.twig',
['menu' => $menu->get()]
);
}
return new Response();
}
mmi_pool
是一个服务,定义如下:
mmi_pool:
parent: cache.adapter.redis
tags:
- name: cache.pool
namespace: ''
缓存是如何配置的config.yml
?
framework:
cache:
default_redis_provider: redis://%redis_host%:%redis_port%
更新
我发现当我第一次登录时,这段代码没有被执行:
if (!$menu->isHit()) {
$menu->set($cached_items);
$cache->save($menu);
}
我不确定为什么。这导致缓存存储了错误的项目,因此在 SF 上显示了错误的项目。
我在这里做错了什么?我知道缓存很棘手,但我肯定在这里遗漏了一些东西