はじめに
お仕事で、Zend Frameworkのバージョンアップをしなければならなくなった・・と思ったら、Zend Frameworkはもうなくて、Laminas Projectに移って新たなフレームワークとして公開されている。
いちから勉強しないといけないじゃん、ということで、必要な要件を満たせるかどうかを一歩ずつ調査していく。
要件(2)
2つ目の要件は、「同一URLに対して2種類あるテンプレートファイルを端末によって自動切換えできること」。
何かというと、(是非はあると思うが)同一URLに対してPC/スマートフォンとフィーチャーフォンで別々のテンプレートファイルになっていて、端末判定をして振り分けている。 そのため、何かしら方法を考えなければならないという。
まぁ、フィーチャーフォンはもうあと2年も経たずにいなくなるはず(NTTドコモの3G終了が2026年3月31日予定)なので、正直言うと対応したくはないのだけど。
導入
こちらでセットアップした環境を(コピーして)使っていく。
私は以下のようにコピーを作成。
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.tplかview/featurephone/application/index/index.tplをincludeする
- 例:
前者の弱点は、アクションごとにいちいちフィーチャーフォン用のアクションを作らなければならないこと。テンプレートファイルはどちらにしても作ることになるので、まだ後者の方がよかろうということで、後者を採用する方向で進める。
実装
と言っても、フィーチャーフォンを用意できないため、代わりに、view/defaultとview/firefoxを用意して、Firefoxだったら専用ビュー、それ以外はデフォルトビューというようにしてみようと思う。
(決してFirefoxをハブろうとかそういう意図は一切なく、私はGoogle ChromeもFirefoxも、プライベートでも仕事でも愛用しているので誤解なきよう)
まず、コントローラーを修正する。
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 ChromeとFirefoxのそれぞれで、http://192.168.56.xxx/laminas-setup-2-separated-views/public/にアクセスしてみる。


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