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
リスト表示処理実装
リスト表示は、初期表示の/bbs のURLで実行されます。
Controllerでは、index 関数でリストを取得します。
app/Http/Controllers/BbsController.php
index 関数に、掲示板のリストを取得する部分を追加します。
・・省略・・
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('bbs', ['bbses' => Bbs::all()]);
}
・・省略・・
return で返却する部分の、view 関数の指定で、第2引数に、連想配列を入れていきます。
Bladeでは、キーに指定している文字列が変数として利用可能です。
Bbs はモデルですが、Eloquentに all 関数が用意されており、全件を取得します。
ページング処理 (Laravel公式)
全件表示ではなく、1ページ20行、前ページや次ページなどのページング処理を行うには、結構手間がかかります。
Laravelでは、ページング処理(ペジネーション)が簡単に出来る仕掛けを用意しています。
resources/views/bbs.blade.php
Blade側では、Controllerで指定したキーである、$bbses を利用して、ループ処理で全件出力します。
・・省略・・
</form>
<hr>
@foreach($bbses as $b)
<div class="card">
<div class="card-header">
<div class="row">
<div class="col-sm-6">
<strong>{{ $b->title }}</strong>
</div>
<div class="col-sm-6 text-right">
<small>{{ $b->update_at }}</small>
</div>
</div>
</div>
<div class="card-body">
<div class="float-end">
<button type="submit" class="btn btn-outline-danger btn-sm">
<i class="far fa-trash-alt"></i> 削除
</button>
</div>
<div class="card-text">
<p class="white-space" style="white-space: break-spaces;">{{ $b->contents }}</p>
</div>
</div>
</div>
<div class="mt-3"></div>
@endforeach
<div class="mt-5"></div>
</main>
・・省略・・
@foreach にて、Contollerで指定したキー bbses を利用してループしています。
今回は、リストがない場合に何も表示しないようにしています。
リストの中身は、一行ごとに $b 変数に代入されますので、あとはアロー演算子(->) の後に項目名を指定します。
表示する際は、XSS対応を意識して、{{ $var }} の形で表示させます。
内容部部は改行を含みますので、<pre>を利用するか、styleに white-space: break-spaces; を指定しましょう。
※Bootstrapには、break-spaces を指定するものが無いようです。
削除処理実装
削除処理を実行していきます。–resource オプションを指定時は、URL /bbs/{id}、HTTP METHOD DELETE で送信された場合に、
Controllerの destroy 関数が実行されます。
app/Http/Controllers/BbsController.php
destroy 関数の実装を行います。
・・省略・・
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Bbs $bbs
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
Bbs::destroy($id);
return redirect('/bbs');
}
}
destroy 関数の引数ですが、Controllerを作成する際に自動生成される、destroy 関数の引数は、$bbs となっています。
URL の引数に id が入っている為、Bbsのモデルが取れると思いきや、とれませんでした。残念。
ですので、$id に変更しています。これは URL の引数になるので、値が入ります。
Eloquentに、主キー指定でモデルを削除する destroy 関数が用意されています。
引数の $id を指定していモデルの削除を実行します。
indexへリダイレクトすると、リストの再取得が行われて、削除完了になります。
削除後のメッセージ表示 (Laravel公式)
登録後や削除後はページをリダイレクトします。リダイレクトする場合は、パラメータが消えてしまいます。
その場合に、メッセージを表示した場合は、セッションを利用するのですが、Laravelには、セッションに一時的にメッセージを保存する仕掛けが用意されています。
resources/views/bbs.blade.php
Blade側では、HTTP METHOD DELETE で送信します。あまり聞き覚えのないメソッドだと思います。
書き方がありますので、しっかりと覚えて下さい。
・・省略・・
<div class="card-body">
<div class="float-end">
<form method="post" action="{{ route('bbs.destroy', $b->id) }}">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-outline-danger btn-sm">
<i class="far fa-trash-alt"></i> 削除
</button>
</form>
</div>
<div class="card-text">
<p class="white-space" style="white-space: break-spaces;">{{ $b->contents }}</p>
</div>
</div>
・・省略・・
formタグのmethod属性には、post を指定しています。
action属性には、{{ route(‘bbs.destroy’, $b->id) }} を指定していますが、route 関数では、routes/web.php で指定した、Route::resource(‘bbs’, BbsController::class); のキー部分(bbs)に関数名を指定すると、URLが生成されます。
その際、destoryのURLには、{id} が必用になるため、引数に $b->id を指定しています。
@csrf は、登録時と同様にクロスサイト・リクエスト・フォージェリ対応です。
@method(‘DELETE’) をつけることで、HTTP METHOD を DELETE に指定して送信することができます。ちなみに、PUT や PATCH も同様に行います。
ちなみに、HTMLではのformタグでは、HTTP METHODの指定は、POST及びGETのみをサポートしています。なので、PUT、PATCH、DELETEなどは送信することが出来ません。
これで一通りの実装が終了しましたので、ブラウザにて確認してください。
http://localhost/bbs/public/bbs
画面がでて、未入力時にエラーが出たり、入力時に登録できたり、削除出来れば完成です。
動かない場合は、もう一度最初から読み直してください。
次回は、Laravelでの簡単な開発のまとめをお届けします。
