サイトアイコン 上尾市のWEBプログラマーによるブログ

「Laravel 9実践入門 for Mac」の感想・備忘録2

「Laravel 9実践入門 for Mac」の感想・備忘録1の続き

CRUDの作成

環境構築

  1. curl -s https://laravel.build/crud | bash
  2. cd crud
  3. ./vendor/bin/sail up -d
  4. vi config/app.php
    以下を修正。
    'timezone' => 'Asia/Tokyo',
    'local' => 'ja',
  5. ./vendor/bin/sail composer require jeroennoten/laravel-adminlte
  6. ./vendor/bin/sail artisan adminlte:install
  7. ./vendor/bin/sail artisan make:migration
    create_products_table createメソッドに追加
    $table->string('name');
    $table->integer('price');
  8. ./vendor/bin/sail artisan migrate
  9. ./vendor/bin/sail artisan make:model Product
  10. ./vendor/bin/sail artisan make:controller ProductController -r
    ※ -rはリソース用コントローラ
  11. vi routes/web.php
    use App\Http\Controllers\ProductController;

    Route::resource('product', ProductController::class);
    を追加。

一覧ページの作成

  1. mkdir resources/views/product
  2. touch resources/views/product/index.blade.php
@extends('adminlte::page')

@section('title', '商品一覧')

@section('content_header')
    <h1>商品一覧</h1>
@stop

@section('content')
    {{-- 完了メッセージ --}}
    @if (session('message'))
        <div class="alert alert-info alert-dismissible">
            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">
                ×
            </button>
            {{ session('message') }}
        </div>
    @endif

    {{-- 新規登録画面へ --}}
    <a class="btn btn-primary mb-2" href="{{ route('product.create') }}" role="button">新規登録</a>

    <div class="card">
        <div class="card-body">
            <table class="table table-bordered">
                <thead>
                    <tr>
                        <th>商品名</th>
                        <th>価格</th>
                        <th style="width: 70px"></th>
                    </tr>
                </thead>
                <tbody>
                    @foreach ($products as $product)
                        <tr>
                            <td>{{ $product->name }}</td>
                            {{-- 数字フォーマット --}}
                            <td>{{ number_format($product->price) }}</td>
                            <td>
                                <a class="btn btn-primary btn-sm mb-2" href="{{ route('product.edit', $product->id) }}"
                                    role="button">編集</a>
                                <form action="{{ route('product.destroy', $product->id) }}" method="post">
                                    @csrf
                                    @method('DELETE')
                                    {{-- 簡易的に確認メッセージを表示 --}}
                                    <button type="submit" class="btn btn-danger btn-sm"
                                        onclick="return confirm('削除してもよろしいですか?');">
                                        削除
                                    </button>
                                </form>
                            </td>
                        </tr>
                    @endforeach
                </tbody>
            </table>
        </div>
    </div>
@stop
public function index()
{
    return view('product.index', ['products' => Product::all()]);
}

登録ページの作成

  1. ./vendor/bin/sail artisan make:request ProductRequest
  2. touch resources/views/product/create.blade.php
public function authorize()
{
    return true; // falseをtrueに変更
}
public function rules()
{
    return [
        'name' => 'required|string|max:64', // 追加
        'price' => 'required|integer', // 追加
    ];
}
@extends('adminlte::page')

@section('title', '商品登録')

@section('content_header')
    <h1>商品登録</h1>
@stop

@section('content')
    @if ($errors->any())
        <div class="alert alert-warning alert-dismissible">
            {{-- エラーの表示 --}}
            <ul>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif

    {{-- 登録画面 --}}
    <div class="card">
        <form action="{{ route('product.store') }}" method="post">
            @csrf
            <div class="card-body">
                {{-- 商品名入力 --}}
                <div class="form-group">
                    <label for="name">商品名</label>
                    <input type="text" class="form-control" id="name" name="name" value="{{ old('name') }}"
                           placeholder="商品名" />
                </div>
                {{-- 価格入力 --}}
                <div class="form-group">
                    <label for="price">価格</label>
                    <input type="text" class="form-control" id="price" name="price" value="{{ old('price') }}"
                           placeholder="価格" />
                </div>
            </div>
            <div class="card-footer">
                <div class="row">
                    <a class="btn btn-default" href="{{ route('product.index') }}" role="button">戻る</a>
                    <div class="ml-auto">
                        <button type="submit" class="btn btn-primary">登録</button>
                    </div>
                </div>
            </div>
        </form>
    </div>
@stop
protected $fillable = [
    'name',
    'price'
];
public function create()
{
    return view('product.create');
}
public function store(ProductRequest $request)
{
    (new Product())->fill($request->all())->save();
    return redirect()->route('product.index')->with('message', '登録しました');
}
モバイルバージョンを終了