makeコマンド

テンプレートファイル作成

artisanmakeコマンドで、いろいろなテンプレートファイルを自動作成できます。

ターミナル
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引数にControllerActionを配列で指定**します。

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)
    {
        //
    }
}

Laravel超入門