HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

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日予定)なので、正直言うと対応したくはないのだけど。

導入

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

hhelibex.hatenablog.jp

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

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/index.tpl"の中で端末種別をチェックして、"resources/views/pc_smartphone/index.tpl"か"resources/views/featurephone/index.tpl"を@includeする

後者は別途テンプレートファイルを作る必要があり、手間になる。アクションでのビューテンプレートの指定はいずれにしても書かなければならないので、前者を採用する方向で進める。

実装

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

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

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 ChromeFirefoxのそれぞれで、http://<your-ip-address>/laravel-setup-2-separated-views/public/にアクセスしてみる。

Google Chromeの場合

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

Mozilla Firefoxの場合

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 

まとめ

  • 複数のテンプレートファイルに分岐させることはできた