以下の内容はhttps://hhelibex.hatenablog.jp/entry/2024/07/31/132237より取得しました。


Zend FrameworkからLaminasに移行する話(2)

はじめに

お仕事で、Zend Frameworkのバージョンアップをしなければならなくなった・・と思ったら、Zend Frameworkはもうなくて、Laminas Projectに移って新たなフレームワークとして公開されている。

いちから勉強しないといけないじゃん、ということで、必要な要件を満たせるかどうかを一歩ずつ調査していく。

要件(2)

2つ目の要件は、「同一URLに対して2種類あるテンプレートファイルを端末によって自動切換えできること」。

何かというと、(是非はあると思うが)同一URLに対してPC/スマートフォンフィーチャーフォンで別々のテンプレートファイルになっていて、端末判定をして振り分けている。 そのため、何かしら方法を考えなければならないという。

まぁ、フィーチャーフォンはもうあと2年も経たずにいなくなるはず(NTTドコモの3G終了が2026年3月31日予定)なので、正直言うと対応したくはないのだけど。

導入

こちらでセットアップした環境を(コピーして)使っていく。

hhelibex.hatenablog.jp

私は以下のようにコピーを作成。

cp -pr laminas-setup-1-smarty laminas-setup-2-separated-views
cd laminas-setup-2-separated-views

対応案

2つ思いついた。

  • アクションごとに、フィーチャーフォン用のアクションを別に作り、そちらへforwardする
    • 例:application/index/indexアクションならapplication/index/index_fpなどのようにする
  • 最初に読み込まれるテンプレートファイルに端末判定の結果を渡して、その中で端末種別によってincludeするテンプレートファイルを切り替える
    • 例:view/application/index/index.tplの中で端末種別をチェックして、view/pc_smartphone/application/index/index.tplview/featurephone/application/index/index.tplをincludeする

前者の弱点は、アクションごとにいちいちフィーチャーフォン用のアクションを作らなければならないこと。テンプレートファイルはどちらにしても作ることになるので、まだ後者の方がよかろうということで、後者を採用する方向で進める。

実装

と言っても、フィーチャーフォンを用意できないため、代わりに、view/defaultview/firefoxを用意して、Firefoxだったら専用ビュー、それ以外はデフォルトビューというようにしてみようと思う。 (決してFirefoxをハブろうとかそういう意図は一切なく、私はGoogle ChromeFirefoxも、プライベートでも仕事でも愛用しているので誤解なきよう)

まず、コントローラーを修正する。

User-Agentを判定して、Firefoxかどうかをチェックした結果をテンプレートに渡す。

<?php

declare(strict_types=1);

namespace Application\Controller;

use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        $timeStr = date('Y/m/d H:i:s');
        $isFirefox = preg_match('/Firefox/', $_SERVER['HTTP_USER_AGENT']);
        return new ViewModel([
                'time_str' => $timeStr,
                'user_agent' => $_SERVER['HTTP_USER_AGENT'],
                'is_firefox' => $isFirefox,
        ]);
    }
}

続いて、テンプレートファイル。

module/Application/view/application/index/index.tplを以下のように修正する。

{if $is_firefox}
{include file='module/Application/view/firefox/application/index/index.tpl'}
{else}
{include file='module/Application/view/default/application/index/index.tpl'}
{/if}

振り分け先のテンプレートファイルを作成するために、格納先のディレクトリを作成する。

mkdir -p module/Application/view/default/application/index
mkdir -p module/Application/view/firefox/application/index

module/Application/view/default/application/index/index.tplは以下のような内容。

Default view
<br />
PHP version: {$smarty.const.PHP_VERSION}
<br />
Time: {$time_str|escape:"html"}
<br />
Firefox: {$is_firefox}
<br />
User-Agent: {$user_agent|escape:"html"}

module/Application/view/firefox/application/index/index.tplは以下のような内容。

Firefox view
<br />
PHP version: {$smarty.const.PHP_VERSION}
<br />
Time: {$time_str|escape:"html"}
<br />
Firefox: {$is_firefox}
<br />
User-Agent: {$user_agent|escape:"html"}

これら2つは、先頭の行が異なる文字列になっていることに注意。

表示

Google ChromeFirefoxのそれぞれで、http://192.168.56.xxx/laminas-setup-2-separated-views/public/にアクセスしてみる。

Google Chromeの場合

laminas-setup-2-separated-views-1

Mozilla Firefoxの場合

laminas-setup-2-separated-views-2

まとめ

  • 複数のテンプレートファイルに分岐させることはできた
  • 課題
    • テンプレートファイルをincludeするときに、プロジェクトトップディレクトリからの全パスを書かないといけないのはどうにかならないか



以上の内容はhttps://hhelibex.hatenablog.jp/entry/2024/07/31/132237より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14