Zend FrameworkからLaravelに移行する話(2)
はじめに
お仕事で、Zend Frameworkのバージョンアップをしなければならなくなった・・と思ったら、Zend Frameworkはもうなくて、Laminas Projectに移って新たなフレームワークとして公開されている。 しかし、Laminas MVCでは必要な要件を満たさないことが分かってとん挫していた。
そこで、次の候補としてLaravelを挙げて、必要な要件を満たせるかどうかを一歩ずつ調査していく。
要件(2)
2つ目の要件は、「同一URLに対して2種類あるテンプレートファイルを端末によって自動切換えできること」。
何かというと、(是非はあると思うが)同一URLに対してPC/スマートフォンとフィーチャーフォンで別々のテンプレートファイルになっていて、端末判定をして振り分けている。 そのため、何かしら方法を考えなければならないという。
まぁ、フィーチャーフォンはもうあと1年も経たずにいなくなるはず(NTTドコモの3G終了が2026年3月31日予定)なので、正直言うと対応したくはないのだけど。
導入
こちらでセットアップした環境を(コピーして)使っていく。
私は以下のようにコピーを作成。
cp -pr laravel-setup-1-smarty laravel-setup-2-separated-views cd laravel-setup-2-separated-views chmod -R a+w storage/
対応案
2つ考えられる。
- アクションごとに、フィーチャーフォン/その他の判定をして、読み込むビューテンプレートを切り替える
- 最初に読み込まれるテンプレートファイルに端末判定の結果を渡して、その中で端末種別によって@includeするテンプレートファイルを切り替える
後者は別途テンプレートファイルを作る必要があり、手間になる。アクションでのビューテンプレートの指定はいずれにしても書かなければならないので、前者を採用する方向で進める。
実装
と言っても、フィーチャーフォンを用意できないため、代わりに、"resources/views/default"と"resources/views/firefox"を用意して、Firefoxだったら専用ビュー、それ以外はデフォルトビューというようにしてみようと思う。 (決してFirefoxをハブろうとかそういう意図は一切なく、私はGoogle ChromeもFirefoxも、プライベートでも仕事でも愛用しているので誤解なきよう)
まず、コントローラーを修正する。
User-Agentを判定して、Firefoxかどうかをチェックした結果をテンプレートに渡す。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class IndexController extends Controller { public function index() { $timeStr = date('Y/m/d H:i:s'); $isFirefox = preg_match('/Firefox/', $_SERVER['HTTP_USER_AGENT']); $values = [ 'time_str' => $timeStr, 'user_agent' => $_SERVER['HTTP_USER_AGENT'], 'is_firefox' => $isFirefox, ]; if ($isFirefox) { return view( 'firefox.index', $values ); } else { return view( 'default.index', $values ); } } public function welcomeSmarty() { $timeStr = date('Y/m/d H:i:s'); return view('welcome-smarty', ['time_str' => $timeStr]); } }
続いて、テンプレートファイル。
以下のファイル2つを作成する。
resources/views/default/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"}
resources/views/firefox/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つは、先頭の行が異なる文字列になっていることに注意。
最後にルートの設定(routes/web.php)。
<?php use Illuminate\Support\Facades\Route; Route::get('/', [\App\Http\Controllers\IndexController::class, 'index']); Route::get('/welcome-smarty', [\App\Http\Controllers\IndexController::class, 'welcomeSmarty']);
表示
Google ChromeとFirefoxのそれぞれで、http://<your-ip-address>/laravel-setup-2-separated-views/public/にアクセスしてみる。
Default view PHP version: 8.3.22 Time: 2025/09/19 08:31:54 Firefox: 0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36
Firefox view PHP version: 8.3.22 Time: 2025/09/19 08:32:49 Firefox: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:142.0) Gecko/20100101 Firefox/142.0
まとめ
- 複数のテンプレートファイルに分岐させることはできた