1

従来の 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_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