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 () {
// ここに認証が必要なルートを定義
});