前回の BBS は操作が分かりずらかったので作り直しました。デザインも変わりました。
今回は、Laravel で BBS (掲示板)を作ろうと思います。前回作った Todo との違いは、投稿に対して反応 (コメント) がある点でしょう。データ構造的にみても、Todo は同じ構造のデータを複数作っているだけですが、その一つ一つの投稿に対して複数のコメントがあるということは、Todo 構造のデータ一1つに対して、コメント構造のデータが複数つくことになります。こういうことを一対多のリレーション (関係、Relationship) と呼びます。実際に、今回は、Todo 構造のデータベースとコメント構造のデータベースの二つを作ります。
一見、Todo データにコメント欄をつければ良いように思いますが、コメントの数は決まっていません。多数のコメント欄をつけておけば良いように思いますが、それは非効率です。そしてまた、たとえばコメント欄を増やそうと思ったら、そのデータを使うアプリケーションを一度止めなければなりません。いろいろ考えると、データベースを二つ持っていたほうが有利なことが分かります。
完成画面は次のようになります。
任意の場所にプロジェクトを作ります。私は、ホームディレクトリに laravel というフォルダを作り、その中に、 いろいろなプロジェクトを作っています。
コマンドプロンプトもしくはターミナルを起動して、次のようにコマンドします。
# プロジェクトの作成を作成します
# 以前の bbs が同じディレクトリに残っている場合は、それを削除するか、
# 新しく作るプロジェクトの名前を bbs2 などにしてください。
composer create-project laravel/laravel bbs
# プロジェクトのディレクトリに移動
cd bbs
# プロジェクトの起動
php artisan serve
# ブラウザで確認
お使いのブラウザで
localhost:8000
もしくは
127.0.0.1:8000
にアクセスすると Laravel のデフォルトぺージが表示されます。
ルーティング (Routing) とは、localhost:8000/ の / 以下のどのアドレスにアクセスすると、どのぺージが表示されるかを決めることです。
return view('welcome');
を
return view('index');
welcome.blade.php
を
index.blade.php
<h1>This is my BBS.</h1>
php artisan make:model Post -mc
php artisan make:model Comment -mc
<?php
use App\Http\Controllers\PostController;
use App\Http\Controllers\CommentController;
use Illuminate\Support\Facades\Route;
Route::get('/', [PostController::class, 'index'])->name('posts.index');
Route::resource('posts', PostController::class)->except(['index']);
Route::resource('posts.comments', CommentController::class)->only(['store', 'destroy']);
php artisan route:list --name=posts
結果
GET|HEAD / ............................................... posts.index › PostController@index
POST posts ........................................... posts.store › PostController@store
GET|HEAD posts/create .................................. posts.create › PostController@create
GET|HEAD posts/{post} ...................................... posts.show › PostController@show
PUT|PATCH posts/{post} .................................. posts.update › PostController@update
DELETE posts/{post} ................................ posts.destroy › PostController@destroy
POST posts/{post}/comments ............... posts.comments.store › CommentController@store
DELETE posts/{post}/comments/{comment} . posts.comments.destroy › CommentController@destroy
GET|HEAD posts/{post}/edit ................................. posts.edit › PostController@edit
例えば1行目は、GET 方式で / (ルート) にアクセスすると、posts.index という名前で、PostController の index メソッドが呼び出されるという意味になります。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function index()
{
return view('index');
}
}
return view('index'); は、resources/views の index.blade.php を表示しろという意味です