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);
}