я интеграции устаревшее приложение Zend Framework 1 (ZF1) и приложение Symfony 3.2.6 (SF). В двух словах, как это работает:
В качестве примера:
— 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
вызывается из 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.
что я тут не так делаю? Я знаю, что кэширование сложно, но, конечно, я что-то здесь упускаю
Первый раз $menu
является null
, но это всегда null
из-за этого кода: if (!$menu->isHit()) {
Вы выходите из контроллера с
return ...return
заявление.
if (!$menu->isHit()) {
$menu->set($cached_items);
$cache->save($menu);
}
return $menu->get();
Других решений пока нет …