はじめに
お仕事で、Zend Frameworkのバージョンアップをしなければならなくなった・・と思ったら、Zend Frameworkはもうなくて、Laminas Projectに移って新たなフレームワークとして公開されている。 しかし、Laminas MVCでは必要な要件を満たさないことが分かってとん挫していた。
そこで、次の候補としてLaravelを挙げて、必要な要件を満たせるかどうかを一歩ずつ調査していく。
要件(3)
3つ目の要件は、「forwardとredirectができること」。
これはまぁ、機能としてはあるんだろうから、要件というよりやり方の調査という側面が大きいけど。
導入
こちらでセットアップした環境を(コピーして)使っていく。
私は以下のようにコピーを作成。
cp -pr laravel-setup-2-separated-views laravel-setup-3-forward-redirect cd laravel-setup-3-forward-redirect
設定・実装
app/Http/Controllers/IndexController.phpを以下のように編集する(redirectメソッドとforwardメソッドを追加)。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; 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]); } public function redirect() { $isFirefox = preg_match('/Firefox/', $_SERVER['HTTP_USER_AGENT']); if ($isFirefox) { return redirect('/redirected/firefox'); } else { return redirect('/redirected/others'); } } public function forward() { $isFirefox = preg_match('/Firefox/', $_SERVER['HTTP_USER_AGENT']); if ($isFirefox) { $request = Request::create('/forwarded/firefox', 'GET'); return Route::dispatch($request); } else { $request = Request::create('/forwarded/others', 'GET'); return Route::dispatch($request); } } }
以下のコマンドを実行して、2つのコントローラーのひな型を作る。
php artisan make:controller '\App\Http\Controllers\RedirectedController' php artisan make:controller '\App\Http\Controllers\ForwardedController'
それぞれ編集する。
app/Http/Controllers/RedirectedController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class RedirectedController extends Controller { public function firefox() { return view('redirected.firefox'); } public function others() { return view('redirected.others'); } }
app/Http/Controllers/ForwardedController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class ForwardedController extends Controller { public function firefox() { return view('forwarded.firefox'); } public function others() { return view('forwarded.others'); } }
以下の4つのビューファイルを用意する。
resources/views/redirected/firefox.tpl
Redirected Firefox view
resources/views/redirected/others.tpl
Redirected Others view
resources/views/forwarded/firefox.tpl
Forwarded Firefox view
resources/views/forwarded/others.tpl
Forwarded Others view
最後に、routes/web.phpに以下を追記する。
Route::get('/redirect', [\App\Http\Controllers\IndexController::class, 'redirect']);
Route::get('/forward', [\App\Http\Controllers\IndexController::class, 'forward']);
Route::get('/redirected/firefox', [\App\Http\Controllers\RedirectedController::class, 'firefox']);
Route::get('/redirected/others', [\App\Http\Controllers\RedirectedController::class, 'others']);
Route::get('/forwarded/firefox', [\App\Http\Controllers\ForwardedController::class, 'firefox']);
Route::get('/forwarded/others', [\App\Http\Controllers\ForwardedController::class, 'others']);
実行
Firefoxでhttp://<your-ip-address>/laravel-setup-3-forward-redirect/public/redirectにアクセスする。
URLがhttp://<your-ip-address>/laravel-setup-3-forward-redirect/public/redirected/firefoxに変わって以下の画面が出ればOK。
Redirected Firefox view
Firefoxでhttp://<your-ip-address>/laravel-setup-3-forward-redirect/public/forwardにアクセスする。
URLはそのままで、以下の画面が出ればOK。
Forwarded Firefox view
Google Chromeでhttp://<your-ip-address>/laravel-setup-3-forward-redirect/public/redirectにアクセスする。
URLがhttp://<your-ip-address>/laravel-setup-3-forward-redirect/public/redirected/othersに変わって以下の画面が出ればOK。
Redirected Others view
Google Chromeでhttp://<your-ip-address>/laravel-setup-3-forward-redirect/public/forwardにアクセスする。
URLはそのままで、以下の画面が出ればOK。
Forwarded Others view
まとめ
- redirectは問題なくできることを確認
- forwardは、
Request::create()とRoute::dispatch()を使うやり方が『この方法は、Laravel 4.xや5.xの時代から存在しており、現在でも利用できますが、Laravelの内部実装に依存します。』とのことなので、forwardを使用しない方向で再設計するのがよいのかも