6. Controller
makeコマンド
テンプレートファイル作成
artisanのmakeコマンドで、いろいろなテンプレートファイルを自動作成できます。
ターミナル
php artisan make:オプション ファイル名
主なオプション
makeコマンドは以下のようなオプションがあります。
タイプ | 説明 |
---|---|
controller | Controllerファイル |
model | Modelファイル |
migration | DBマイグレーション |
request | Requestファイル |
seeder | Seederファイル |
Controllerファイル
make:controller
make:controller で「app/Http/Controllers/」にControllerファイルを自動作成します。
ターミナル
php artisan make:controller コントローラ名
サブフォルダの指定
サブフォルダの中にControllerを作成するときは、「 / 」でフォルダを指定します。
ターミナル
php artisan make:controller フォルダ名/コントローラ名
コントローラの作成
HomeControllerの作成
「HomeController」を作成してみましょう。ファイル名は「Controller」の命名規則とします。
ターミナル
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
{
//
}
namespaceの確認
「App\Http\Controllers\Controller」は、コントローラのnamespace(名前空間)です。
use App\Http\Controllers\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, コントローラメソッド);
...
Actionの基本
Actionとは
ルーティングからControllerメソッドをAction(アクション) といいます。アクション名はなるべくルーティングの名称にあわせると管理しやすくなります。
Action追加
「HomeController」クラスに「about」アクションを追加し、view() メソッドでテンプレートを表示します。
HomeController.php
class HomeController extends Controller
{
public function about()
{
return view('about');
}
}
Controllerのルーティング
Actionの設定
ルーティング設定
ルーティングでコントローラアクションを実行するには、第2引数にControllerとActionを配列で指定**します。
Route::get(パス, [コントローラ名::class, アクションメソッド]);
- Controllerクラス:「コントローラ名::class」で記述
- アクションメソッド:「Controllerクラス」のメソッド名を記述
Laravelの旧バージョンは注意
「Laravel5」のような古いバージョンでは、配列でなく文字列で設定するので注意が必要です。
Route::get(パス, "コントローラー::class@アクション");
ルーティング修正
コントローラの利用
ルーティングファイル「web.php」に「HomeController」のnamespace をコードアシスタントで入力します。
web.php
use App\Http\Controllers\HomeController;
アクションの設定
ルーティング「/about」を「HomeController」クラスの「about」メソッドを実行します。
web.php
Route::get('/about', [HomeController::class, 'about']);
動作確認
コントローラアクションでルーティングできたか確認してみましょう。
Controller処理
Requestオブジェクトの利用
ルーティング
「HomeController」の「search」アクションでルーティングします。
web.php
Route::get('/search', [HomeController::class, 'search']);
アクションの実装
コントローラーはHTTPリクエストが発生すると、ActionメソッドでRequestオブジェクトが利用できるようになっています。
HomeController.php
public function search(Request $request)
{
//処理
}
Viewにデータバインド
Requestオブジェクトのパラメータを連想配列にして、ビューに受け渡します。
HomeController.php
public function search(Request $request)
{
$data = [
'keyword' => $request->keyword,
];
return view('search', $data);
}
パラメータ取得
コントローラ作成
「item」に関するルーティングをするために、artisanコマンドに「 -r 」オプションをつけて「ItemController」を作成します。
ターミナル
php artisan make:controller ItemController -r
「 -r 」オプションを指定すると、コントローラーファイルでよく利用するActionメソッドが自動追加されます。
ItemController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ItemController 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)
{
//
}
}
ルーティング
「ItemController」の「show」メソッドにルーティングするよう修正します。
web.php
use App\Http\Controllers\ItemController;
...
Route::get('/item/{id}', [ItemController::class, 'show']);
Actionの実装
ルーティングで指定された「id」は、「show」メソッドの引数の変数名として取得できます。
ItemController.php
public function show(int $id)
{
}
商品テストデータから指定「id」で商品名を取得し、ビューに受け渡します。
public function show(int $id)
{
$items = [
1 => "コーヒー",
2 => "紅茶",
3 => "ほうじ茶",
];
$item = "";
if ($id > 0) $item = $items[$id];
$data = ['item' => $item];
return view('item.show', $data);
}
Viewの作成
「views/item/」フォルダに「show.blade.php」を作成します。
views/item/show.blade.php
<!DOCTYPE html>
<html lang="jp">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h2>商品名</h2>
<p>{{ $item }}</p>
</body>
</html>
ブラウザで確認
「/item/ID」にアクセスしてデータが表示されるか確認してみましょう。
ソース
web.php
<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;
use App\Http\Controllers\HomeController;
use App\Http\Controllers\ItemController;
Route::get('/', function () {
return view('welcome');
});
Route::get('/about', [HomeController::class, 'about']);
Route::get('/search', [HomeController::class, 'search']);
Route::get('/item/{id}', [ItemController::class, 'show']);
Route::get('/item/edit/{id}', function (int $id) {
$message = "ID is {$id}";
return $message;
});
HomeController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
public function about()
{
return view('about');
}
public function search(Request $request)
{
$data = [
'keyword' => $request->keyword,
];
return view('search', $data);
}
}
ItemController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ItemController extends Controller
{
public function show()
{
//
}
public function create()
{
//
}
public function store(Request $request)
{
//
}
public function show($id)
{
$items = [
1 => "コーヒー",
2 => "紅茶",
3 => "ほうじ茶",
];
$item = "";
if ($id > 0 && array_key_exists($id, $items)) $item = $items[$id];
$data = ['item' => $item];
return view('item.show', $data);
}
public function edit($id)
{
//
}
public function update(Request $request, $id)
{
//
}
public function destroy($id)
{
//
}
}