18. 商品入力フォーム

商品入力フォーム

商品入力フォームの作成

商品入力画面に「商品名」「商品コード」「価格」のフォームを追加します。

admin/item/create.blade.php
<div>
    <h2>商品入力</h2>
    <form action="{{ route('admin.item.add') }}" method="post">
        @csrf

        <div>
            <label for="name">{{ __('Item Name') }}</label>
            <input type="text" name="name">
        </div>
        <div>
            <label for="name">{{ __('Item Code') }}</label>
            <input type="text" name="code">
        </div>
        <div class="mb-8">
            <label for="price">{{ __('Price') }}</label>
            <input type="number" name="price">
        </div>
        <button>{{ __('Add') }}</button>
        <a href="{{ route('admin.item.index') }}">{{ __('Back') }}</a>
    </form>
</div>

商品追加処理

商品入力フォームのリクエストデータを、「items」テーブルにレコード追加してみましょう。

Itemモデル読み込み

「ItemController」で「Item」モデルを読み込みます。

Admin/ItemController.php
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
//追加
use App\Models\Item;

リクエストデータ確認

POSTリクエストのデータを取得し、dd() でデバッグ表示します。

Admin/ItemController.php
public function add(ItemRequest $request)
{
    $posts = $request->all();
    dd($posts)
    return redirect()->route('admin.item.index');
}

商品入力画面にデータを入力して更新します。

結果

レコード挿入

デバッグを確認したらレコード挿入(INSERT)します。

Admin/ItemController.php
public function add(ItemRequest $request)
{
    $posts = $request->all();
    Item::create($posts);
    return redirect()->route('admin.item.index');
}

ルーティングの共通化

ルーティングの問題点

ルーティングが増えてくるとソースコードの量も増え、管理しづらくなってきます。

共通化 なし
Route::get('/admin/item/', [ItemController::class, 'index'])
    ->name('admin.item.index');
Route::get('/admin/item/create', [ItemController::class, 'create'])
    ->name('admin.item.create');
Route::post('/admin/item/add', [ItemController::class, 'add'])
    ->name('admin.item.add');
Route::get('/admin/item/edit/{id}', [ItemController::class, 'edit'])
    ->name('admin.item.edit');
Route::post('/admin/item/update/{id}', [ItemController::class, 'update'])
    ->name('admin.item.update');

ルーティングの共通化

ルーティングの共通化には、いくつかの方法があります。

group()

group() を使って、ルーティングをグループ化することができます。

web.php
Route::group(function() {
    Route::get(xxx, xxxx);
    Route::get(xxx, xxxx);
    ...
});
group() あり
Route::group(function () {
        Route::get('/admin/item/', [ItemController::class, 'index'])
      ->name('admin.item.index');
        Route::get('/admin/item/create', [ItemController::class, 'create'])
      ->name('admin.item.create');
        Route::post('/admin/item/add', [ItemController::class, 'add'])
      ->name('admin.item.add');
        Route::get('/admin/item/edit/{id}', [ItemController::class, 'update'])
      ->name('admin.item.edit');
        Route::post('/admin/item/update/{id}', [ItemController::class, 'update'])
      ->name('admin.item.update');
    });

prefix()

prefix() で、URLのルートプリフィックスをグループ化できます。

Route::prefix(プリフィックス)
prefix() あり
Route::prefix('admin/item')
    ->namespace('Admin')
    ->group(function () {
        Route::get('/', [ItemController::class, 'index'])->name('admin.item.index');
        Route::get('/create', [ItemController::class, 'create'])->name('admin.item.create');
        Route::post('/add', [ItemController::class, 'add'])->name('admin.item.add');
        Route::get('/edit/{id}', [ItemController::class, 'update'])->name('admin.item.edit');
        Route::post('/update/{id}', [ItemController::class, 'update'])->name('admin.item.update');
    });

prefix()

prefix() で、ルート名をグループ化できます。

prefix() あり
Route::prefix('admin/item')
    ->name('admin.item.')    // ルート名
    ->group(function () {
        Route::get('/', [ItemController::class, 'index'])->name('index');
        Route::get('/create', [ItemController::class, 'create'])->name('create');
        Route::post('/add', [ItemController::class, 'add'])->name('add');
        Route::get('/edit/{id}', [ItemController::class, 'update'])->name('edit');
        Route::post('/update/{id}', [ItemController::class, 'update'])->name('update');
    });

namespace()

namespace() は、ルーティンググループに対してnamespace(名前空間)を指定するための機能です。コントローラーの名前空間を指定せずに、グループ内のコントローラー定義できます。

namespace() あり
Route::prefix('admin/item')
    ->name('admin.item.')
    ->namespace('Admin')    // namespace App\Http\Controllers\Admin\ItemController
    ->group(function () {
        Route::get('/', [ItemController::class, 'index'])->name('index');
        Route::get('/create', [ItemController::class, 'create'])->name('create');
        Route::post('/add', [ItemController::class, 'add'])->name('add');
        Route::get('/edit/{id}', [ItemController::class, 'update'])->name('edit');
        Route::post('/update/{id}', [ItemController::class, 'update'])->name('update');
    });

middleware()

グループ化することで、ミドルウェアをまとめて処理することもできます。 以下はルーティンググループに対して、authミドルウェアを設定した例です。

middleware() あり
Route::middleware(['auth'])->group(function () {
    // ここに認証が必要なルートを定義
});

Laravel超入門