従来の Zend Framework 1 (ZF1) アプリケーションと Symfony 3.2.6 (SF) アプリケーションを統合しています。一言で言えば、それがどのように機能するかです:
- セッション管理、ログイン ページ (一意のエントリポイント)、および多くのものは、ZF1 アプリケーションと ZF1 自体によって管理されます。
- Zend コントローラー、テンプレート、ヘルパー、またはその他の SF 側からの呼び出しはありません。
例: - http://localhost/login
=> は ZF1 によって管理されます - http://localhost/sf/quote
=> は SF によって管理されます (キーは/sf/
URL 内の です)。
これは、Apache VH に次のようなルールがあることを意味します: Symfony/sf/*
に送信された URL 上の各リクエストは、app.php|app_dev.php
このルールをバイパスし、ZF1 に直接送信されます。
最初に行うことは、レガシー ZF1 アプリケーションを使用してアプリケーションにログインすることです。ログインに成功したら、ダッシュボードにリダイレクトし、次のコードを使用してレイアウトNavigationController.php
から a を呼び出します: .main.phtml
$this->action('buildallmenu', 'navigation');
このようなコードでは、DB からメニューが生成され、以下のコードを使用して、ZF1 からも SF からも DB にアクセスする必要がなく、もう一度 DB にアクセスしたくないので、キャッシュしようとしています。
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()
メニューはユーザーごとに「一意」であるため、 Redissession_id()
キャッシュ項目に追加するのが理にかなっています。
そこから、$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 で間違ったアイテムが表示されます。
私はここで何を間違っていますか?キャッシングが難しいことは知っていますが、確かにここに何かが欠けています