6.
Controller
アクション(Action)
Actionとは
ルーティングに対応した Controllerのメソッドを、Action(アクション) といいます。アクション名はなるべくルーティングの名称にあわせると管理しやすくなります。
ルーティングの問題点と改善
プログラムの肥大化
ルーティングはシステム規模が大きくなると、多数設定しなければいけません。その分コーディングが多くなり、プログラム肥大化の原因になります。
Route::get(URL, function (Request $request) {
//処理...
return view(Bladeのパス);
});
Route::get(URL, function (Request $request) {
//処理...
return view(Bladeのパス);
});
Route::get(URL, function (Request $request) {
//処理...
return view(Bladeのパス);
});
...
ルーティングをシンプルにする
Routeのリクエストメソッドの第2引数は、Closures(コールバック)で処理してますが、Controllerメソッドで指定すると、Routingがシンプルになります。
Route::get(URL, コントローラメソッド);
Route::get(URL, コントローラメソッド);
Route::get(URL, コントローラメソッド);
...
Controllerファイル
make:controller
make:controller で「app/Http/Controllers/」にControllerファイルを自動作成します。
ターミナル
php artisan make:controller コントローラ名
サブフォルダの指定
サブフォルダの中にControllerを作成するときは、/ でフォルダを指定します。
ターミナル
php artisan make:controller フォルダ名/コントローラ名
コントローラの作成
HomeControllerの作成
HomeControllerを作成します。
ターミナル
php artisan make:controller HomeController
コントローラファイルの確認
app/Http/Controllers/HomeController.php が作成されました。
アクションとビューの追加
作成されたコントローラに、最低限のコードが記載されています。クラスの中に、必要に応じてActionメソッドを追加していきます。
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class HomeController extends Controller
{
//
}
about() 追加
HomeControllerクラスにaboutアクションを追加し、about ビューを表示します。
HomeController.php
class HomeController extends Controller
{
// abount アクション
public function about()
{
// about ビュー表示
return view('about');
}
}
ルーティング
ルーティングでコントローラアクションを実行するには、第2引数にControllerとActionの配列を指定します。
Route::get(パス, [コントローラ名::class, Actionメソッド]);
ルーティング名
name() はルーティングに名前を付けるためのメソッドです。
名前を付けると、そのルートを URL 文字列ではなく名前で参照できるようになります。
Route::get(パス, [コントローラ名::class, Actionメソッド])->name(ルーティング名);
ルーティング修正
| ページ | ルーティング | ビュー | ルーティング名 |
|---|---|---|---|
| トップ | / | resouces/views/home/index.blade.php | home |
| About | /about | resouces/views/home/about.blade.php | about |
| 商品トップ | /product | resouces/views/product/index.blade.php | product.index |
| 商品詳細 | /product/show/{id} | resouces/views/product/show.blade.php | product.show |
| 検索 | /search | resouces/views/product/search.blade.php | product.search |
コントローラの利用
ルーティングファイルweb.phpに HomeControllerのnamespace をコードアシスタントで入力します。
web.php
use App\Http\Controllers\HomeController;
アクションの設定
HomeController->about() に対して、ルーティング名 about でルーティングします。
web.php
Route::get('/about', [HomeController::class, 'about'])->name('about');
動作確認
コントローラアクションでルーティングできたか確認してみましょう。
パラメーター処理
コントローラ作成
artisanコマンドに-rオプションをつけて ProductControllerを作成します。
ターミナル
php artisan make:controller ProductController -r
コントローラーファイルでよく利用するActionメソッドが自動追加されます。
App/Http/Controllers/ProductController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProductController extends Controller
{
public function index()
{
//
}
public function create()
{
//
}
public function store(Request $request)
{
//
}
public function show($id)
{
//
}
public function edit($id)
{
//
}
public function update(Request $request, $id)
{
//
}
public function destroy($id)
{
//
}
}
ルーティング
web.php で ProductController を利用します。
web.php
use App\Http\Controllers\ProductController;
ProductController->index() に対して、ルーティング名 product.index でルーティングします。
web.php
Route::get('/product', [ProductController::class, 'index'])->name('product.index');
ProductController->show() に対して、ルーティング名 product.show でルーティングします。
web.php
Route::get('/product/{id}', [ProductController::class, 'show'])->name('product.show');
Actionの実装
ルーティングで指定された id は、show() の引数で取得できます。
App/Http/Controllers/ProductController.php
public function show(int $id)
{
}
送信された id で商品名を取得し、ビューに受け渡します。
public function show(int $id)
{
$products = [
1 => ['name' => 'コーヒー', 'price' => 300],
2 => ['name' => '紅茶', 'price' => 250],
3 => ['name' => 'ほうじ茶', 'price' => 200],
];
$product = "";
if ($id > 0) $product = $products[$id];
$data = ['product' => $product];
return view('product.show', $data);
}
Viewの作成
views/product/show.blade.phpを作成します。
php artisan make:view product/show
views/item/show.blade.php
<div>
<h2>商品名</h2>
<p>{{ $product['name'] }}</p>
<h2>価格</h2>
<p>¥{{ $product['price'] }}</p>
</div>
ブラウザで確認
/product/{id} にアクセスしてデータが表示されるか確認してみましょう。
Requestオブジェクトの利用
ルーティング
ProductController->search() に対して、ルーティング名 product.search でルーティングします。
web.php
Route::get('product/search', [ProductController::class, 'search']);
アクションの実装
コントローラーはHTTPリクエストが発生すると、ActionメソッドでRequestオブジェクトが利用できるようになっています。
App/Http/Controllers/ProductController.php
public function search(Request $request)
{
//処理
}
Viewにデータバインド
Requestオブジェクトのパラメータを連想配列にして、ビューに受け渡します。
App/Http/Controllers/ProductController.php
public function search(Request $request)
{
$data = [
'keyword' => $request->keyword,
];
return view('search', $data);
}