1

PhpRenderer に問題があります。コンテキストから始めましょう。それらをキャッシュするために一連の静的ページを生成する必要があります(ファイルシステムアダプターを使用したキャッシュストレージを使用)。そのため、EVENT_ROUTE にイベントを接続して、静的ページが存在する場合はそれを提供し、EVENT_FINISH にイベントを接続して、応答コンテンツを取得し、それをキャッシュ ファイルに書き込みました。それはうまく動作します。

私の問題は、ナビゲーションの前にこれらのページを生成したいということです (生成するページが約 300 万あります)。私のアイデアは、巨大なタスクをスケジュールできるように、CLI で呼び出すことができるコントローラーを作成することでした。したがって、2 番目のコントローラーでは、関心のある ViewModel を返すコントローラーを呼び出し、レンダラーを構築し、アクション ViewModel とレイアウトをレンダリングして、ページの HTML 全体を取得します。

コードは次のとおりです。

public static function GetStaticResponse(ServiceManager $sm, AbstractActionController $controller, array $routeParams){
    $event = new MvcEvent();
    $request = new Request();
    // $controller = new $controller();
    $router = $sm->get('Router');

    // Test values!!!
    // $routeMatch = new RouteMatch(array('controller' => 'index', 'action' => 'showad', 'ad_id' => '1002293747'));
    // Test values end !!

    $routeMatch = new RouteMatch($routeParams);

    $event->setRouter($router);
    $event->setRouteMatch($routeMatch);
    $controller->setEvent($event);
    $pluginManager = $sm->get('ControllerPluginManager');
    $controller->setServiceLocator($sm);
    $controller->setPluginManager($pluginManager);

    $view = $controller->dispatch($request);

    $config = $sm->get('Config');

    $renderer = new PhpRenderer($config);
    $map = new TemplateMapResolver(
        $config['view_manager']['template_map']
    );

    $renderer->setResolver($map);
    $renderer->setHelperPluginManager($sm->get('ViewHelperManager'));
    $view->setTemplate('showad');
    $content = $renderer->render($view);

    $renderer = new PhpRenderer($config);
    $map = new TemplateMapResolver(
        $config['view_manager']['template_map']
    );
    $renderer->setResolver($map);
    $renderer->setHelperPluginManager($sm->get('ViewHelperManager'));
    $viewLayout = new ViewModel();
    $viewLayout->setTemplate('layout/layout');
    $viewLayout->setVariables(array("content" => $content));

    $render = $renderer->render($viewLayout);
    unset($event, $request, $router, $routeMatch, $controller, $pluginManager, $view, $config, $renderer, $content, $viewLayout);
    return $render;

}

このメソッドは、一度だけ実行するとうまく機能します。このメソッドをループで再度呼び出すと、Renderer にはいくつかの静的プロパティがあるように見え、レイアウトが「headTitle」や「headLink」などのヘルパーを呼び出すたびに、タイトルとリンクが何度も追加されます。

例:最初のループ

<!DOCTYPE html><html lang="fr">
  <head>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
    <link rel="icon" type="image/ico" href="http://apte.local/images/favicon.ico">
            <title>title</title>            
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- Le styles -->
    <link href="http://apte.local/images/favicon.ico" rel="shortcut icon" type="image/vnd.microsoft.icon">
<link href="http://apte.local/css/style.min.css" media="screen" rel="stylesheet" type="text/css">
<link href="http://apte.local/js/jquery/css/ui-lightness/jquery-ui.css" media="screen" rel="stylesheet" type="text/css">
    <!-- Scripts -->

2 番目のループ:

<!DOCTYPE html><html lang="fr">
  <head>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
    <link rel="icon" type="image/ico" href="http://apte.local/images/favicon.ico">
            <title>title - title</title><!-- title generated with headTitle -->            
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- in layout headMeta is used to generate meta -->
    <!-- Le styles -->
    <link href="http://apte.local/images/favicon.ico" rel="shortcut icon" type="image/vnd.microsoft.icon">
<link href="http://apte.local/css/style.min.css" media="screen" rel="stylesheet" type="text/css">
<link href="http://apte.local/js/jquery/css/ui-lightness/jquery-ui.css" media="screen" rel="stylesheet" type="text/css">
<link href="http://apte.local/images/favicon.ico" rel="shortcut icon" type="image/vnd.microsoft.icon"> <!-- in layout headLink helper is used to generate the link -->
    <!-- Scripts -->

私の考えが正しいかどうかわかりません。ユニットテストと同じロジックを使用してアクションを実行できると思いましたが、何か不足していますか?

私がすでにコーディングしたイベントをトリガーする方法があり、それが http モードで正常に動作するかどうか疑問に思います。

(EVENT_DISPATCH で echo 'test' を配線するようにテストしましたが、私のイベントは 1 回だけ発生します。$controller->dispatch(...) は現在のイベント マネージャーのディスパッチ イベントを発生しません。)

誰かがアイデアを持っている場合、または同様のケースに直面している場合は、それを解決するためにあなたがどのように行ったかを読んでうれしいです.

4

2 に答える 2