Laravelで簡単な掲示板を作成の巻 第3話 魁!小野の塾
Laravelで簡単な掲示板を作成
魁!小野の塾 PHPで簡単なプログラムを作ってみようの巻 第1話 では、簡単な掲示板をPHPで作成しました。
今回は、同じような機能をLaravelで構築していきます。
機能的には、登録処理、削除処理、エラーチェックなどを実装していきます。
前回のソースは、200行程度の1ファイルだったのですが、今回はどのように書き方が変わるのか、見ていければ良いかと思います。
また、フレームワークを利用する機会は増えましたので、しっかり開発手順を覚えて頂きたいです。
Bootstrapを利用したサンプルを作成していますが、Laravelは Tailwind をCSSのフレームワークとして押しています。
Tailwindはコンポーネント開発を前提としたCSSフレームワークで、CSSを知っている人には使いやすいですが、Bootstrapを長年利用している人には、少し難易度が高いと思います。
対象のスキルレベル
- 魁!小野の塾 開発環境構築の巻 XAMPPインストール を読み環境構築済である
- Composerインストール(Windows) 開発環境構築の巻 魁!小野の塾 を読み環境構築済である
- Laravelの環境構築 開発環境構築の巻 魁!小野の塾 を読み環境構築済である
- 魁!小野の塾 PHPで簡単なプログラムを作ってみようの巻 第1話 を読み一通り理解できる
- 追いつけない方は、魁!小野の塾 目次 から入門編を一通り見て下さい。
構築環境
- Windows10
- XAMPP 8.1.2(PHP 8.1.2, MariaDB 10.4.22)
- Laravel v9.33.0
登録処理作成
登録処理から実装していきます。
登録処理には、Blade(View)の作成、Validation、DBへの登録処理があり、順番に実装していきます。
resources/views/bbs.blade.php Bladeの実装
登録処理、エラー表示部分の実装を行います。
・・省略・・ <body> <header> <nav class="navbar navbar-expand-lg navbar-dark bg-success fixed-top"> <section class="container"> <a class="navbar-brand" href="#"> <h1 class="animate__animated animate__backInRight"><i class="far fa-clipboard"></i> 掲示板</h1> </a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarText"> <span class="navbar-text animate__animated animate__bounce animate__delay-3s"> <i class="fas fa-heart"></i> 好きなこと書いて生きよう! </span> </div> </section> </nav> </header> <main class="container"> @if ($errors->any()) <div class="alert alert-danger" role="alert"> <h4 class="alert-heading"><i class="fas fa-exclamation-triangle"></i> エラー</h4> <ul> @foreach($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif ・・省略・・
エラー表示部分(44-53)
Bladeでは、@~という構文が用意されています。ifとかforeachなど色々あります。
普通にif文を書く感覚で利用できるのですが、@if ~ @endif と終了のコードを書く必要があります。
通常のPHPの場合は、{ } ブロックにて開始、終了を決定するのに対して、少し厄介かもしれません。
慣れるまではしっかりと、終了コードを書くことを意識するようにして下さい。(忘れがちです)
Laravelでは、Validationのエラー内容は、$errors 変数に入ります。
any() 関数では、エラーがある場合に、true ない場合に false が返ります。
44行目のif文は、エラーがある場合という意味になります。
エラーの内容を全て取り出すには、all() 関数を利用します。
@foreach 構文は、通常の foreach と同様に書くことができます。
ただ、if文と同様に終了コードを書く必要があることを意識してください。
{{ $error }} では、エラーの内容を echo しています。
<?= htmlspecialchars($error) ?> と同様な意味になります。
Blade参考 (Laravel公式)
・・省略・・ <form method="post"> @csrf <div class="form-group row mb-3"> <label for="title" class="col-sm-2 col-form-label">タイトル</label> <div class="col-sm-10"> <input type="text" name="title" class="form-control" id="title" placeholder="タイトル" value="{{ old('title') }}" autofocus> </div> </div> <div class="form-group row mb-3"> <label for="contents" class="col-sm-2 col-form-label">内容</label> <div class="col-sm-10"> <textarea name="contents" class="form-control" id="contents" rows="10" placeholder="内容を入力してください">{{ old('contents') }}</textarea> </div> </div> <div class="form-group row"> <div class="offset-sm-2 col-sm-10"> <button type="submit" class="btn btn-primary"><i class="fas fa-paper-plane"></i> 送信</button> </div> </div> </form> <div class="mt-5"></div> </main> ・・省略・・
入力フォーム部分
登録処理は、Controller#storeを呼び出すのですが、URLは /bbs で HTTP METHOD は POST になります。
action属性は指定していないと、現在のURLに対して送信を行いますので、action属性が未指定になっています。
@csrf は、クロスサイト・リクエスト・フォージェリー対応です。
この記述を忘れると、Laravel側でエラーを出力します。
name属性には、テーブルの項目名を設定します。これで、モデルと紐づいて、データベースに登録が可能です。
{{ old(key) }} old関数は、form送信時にエラーがある場合に、その入力値を表示してくれます。
第2引数にデフォルト値を設定することもできます。
例えば、初期表示時に「へのへのもへじ」と表示したい場合、{{ old(‘title’, ‘へのへのもへじ’) }} とすると、初期表示では「へのへのもへじ」と表示され、入力値がエラーの場合のみ、入力値が表示されます。
app/Http/Requests/StoreBbsRequest.php Validationの実装
エラーチェック部分を実装します。
Controllerを作成するときのコマンドで、–requests オプションを指定すると、リクエストのエラーチェックを自動で行ってくれるクラスを自動生成できます。
- 登録用 StoreBbsRequest.php
- 更新用 UpdateBbsRequest.php
今回は、更新処理がないので、登録用の StoreBbsRequest.php のみを変更していきます。
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class StoreBbsRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'title' => 'required|max:255', 'contents' => 'required|max:65535', ]; } public function messages() { return [ 'title.required' => 'タイトルを入力して下さい。', 'title.max' => 'タイトルは:max文字以内で入力してください。', 'contents.required' => '本文を入力して下さい。', 'contents.max' => '本文は:max文字以内で入力して下さい。', ]; } }
authorize(16)
デフォルトは、return false; となっています。今回はログイン機能を実装しない為、true を返すように変更します。
なお、変更しない場合は、認証エラーとなります。変更後は、未ログイン状態でも実行できるようになります。
rules(27-28)
項目名に対して、チェック内容を記載します。複数ある場合は、パイプ記号 ( | ) で区切ります。
今回は、必須チェック (required) と最大文字数チェック (max) を入れていきます。
messages(32-40)
日本語化を行う方法は、別にあるのですが、今回は項目数もチェック内容も少ないので、この関数を作成し、エラーメッセージを日本語化しています。
項目名.チェックタイプ の指定で、エラーメッセージを書いていきます。
Validation参考 (Laravel公式)
app/Http/Controllers/BbsController.php Controllerの実装
最後に登録処理の実態を作成します。
登録処理は、Controllerの store 関数に作成しています。
・・省略・・ /** * Store a newly created resource in storage. * * @param \App\Http\Requests\StoreBbsRequest $request * @return \Illuminate\Http\Response */ public function store(StoreBbsRequest $request) { $bbs = new Bbs(); // Modelをインスタンス化 $bbs->create($request->all()); // requestからfillを通してモデルを作成後、登録処理 return redirect('/bbs'); // indexへリダイレクトします } ・・省略・・
モデルをインスタンス後に、create 関数を利用してデータベースへ登録します。
リクエスト情報から、モデルの項目名に紐づくデータを取得して、モデルを作成してくれます。この際に、モデルに定義した $fillable の内容を利用します。
$fillable が未設定の場合は、リスエスト自体に @csrf が含まれており、_token という名前で、パラメータが送信されます。
モデルに存在しないキー名なので、$reqest->all() を利用する場合は、エラーになります。
$fillable を定義したくない場合は、$request から指定キーの配列を作成すれば良いのですが、モデルに定義しておいた方が簡単かと思います。
Laravelでは固定の書き方はなく、柔軟なコーディングが可能になっていますので、他のサンプルなどもみて、自分の好きなコードの書き方を研究してください。
最後に、/bbs のURLに対してリダイレクトして終了です。
次回は、リスト表示の実装と、削除機能の実装を行います。