1

我正在集成一个遗留的 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_itemsvar 填充了正确的内容,并将其保存到 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 上显示了错误的项目。

我在这里做错了什么?我知道缓存很棘手,但我肯定在这里遗漏了一些东西

4

1 回答 1

2

第一次$menunull,但它总是null 因为那个代码:你用语句if (!$menu->isHit()) { return ...退出控制器。return

if (!$menu->isHit()) {
    $menu->set($cached_items);
    $cache->save($menu);
}

return $menu->get();
于 2017-03-13T22:36:27.093 回答