今回は投稿フォームを作成して掲示板に投稿する機能を追加します。

テンプレートを共通化する

作成するページとして投稿された文章を表示する掲示板のトップページ、新規投稿用のフォームを表示するページ、既存の投稿を編集するフォームを表示するページ、個別の投稿文を表示するページがあります。しかしこれらにはヘッダーやフッターなど共通部分があります。そこでその部分を先に作成します。

共通部分をまとめてしまえば、Webデザインの作成やメンテナンスも効率よく進められます。

そのために(プロジェクトのフォルダ)\resources\viewsのなかにlayout.blade.phpを作成します。ファイルの名前は○○.blade.phpでなければなりません。

resources\views\layout.blade.php

ルーティングの設定

それからルーティングの設定をおこないます。

(プロジェクトのフォルダ)\routes\web.phpを以下のように編集します。

前回モデルArticleを作成してマイグレーションをしましたが、このときにArticleControllerクラスが自動生成されます。以下のように記述することで、トップページにアクセスされた場合はindex関数が実行されてページが表示されます。投稿の個別ページを見るのであれば/article/{id}にアクセスすればよく、そのときの処理はArticleControllerクラスのshow関数におこなわせるという感じです。

routes\web.php

トップページの作成

まずトップページを作成します。

(プロジェクトのフォルダ)\resources\views\index.blade.phpというファイルを作成し、そこに以下を記述します。

resources\views\index.blade.php

モデルArticleを作成してマイグレーションしたときに(プロジェクトのフォルダ)\app\Http\ControllersのなかにArticleController.phpというファイルが自動生成されているはずです。ここに以下を記述します。

すでにユーザー管理機能を追加するために必要なライブラリ laravel/uilをインストールしているので簡単にログインしていないユーザーができることを制限することができます。コンストラクタのなかに$this->middleware(‘auth’)->except([‘index’, ‘show’]);と書いてしまえば新規投稿や既存の投稿を編集したり削除することができなくなります。

app\Http\Controllers

投稿の新規作成機能の追加

新規作成の処理をするにあたってデータベースにカラムを追加します。

するとマイグレーションファイルが自動生成されるので編集します。user_idというカラムを追加したいだけなので1行追加するだけです。

マイグレーションファイルを編集したら忘れずにマイグレーションしておきましょう。

次に新規投稿のページを表示するために(プロジェクトのフォルダ)\resources\viewsフォルダのなかにnew.blade.phpというファイルを作成し、以下を記述します。

resources\views\new.blade.php

次にArticleControllerクラスのcreate関数を定義します。

app\Http\Controllers

個別の投稿内容を表示するページを作成する

次に投稿内容を表示するページに関する処理を示します。(プロジェクトのフォルダ)\resources\viewsのなかにshow.blade.phpを作成します。

resources\views\show.blade.php

次にArticleControllerクラスのshow関数を定義します。

app\Http\Controllers

投稿の編集機能の追加

投稿したらこれを編集できるようにしなければなりません。(プロジェクトのフォルダ)\resources\viewsのなかにedit.blade.phpを作成します。

resources\views\edit.blade.php

次にArticleControllerクラスのedit関数とupdate関数を定義します。

ログインしていない状態で該当ページにアクセスしようとするとログインページにリダイレクトされます。しかしログインしている場合は他人の投稿文を編集したり削除することができてしまいます。そこで投稿文を作成したユーザーとログインしているユーザーのユーザーIDを比較しています。

ログインしているユーザーであっても自分が投稿したものでないなら編集は不可とします。いまの状態ではページにリンクは表示されないようにしていますが、urlを自分で生成すればページにアクセスすることはできてしまいます。そこでログインしているユーザーであり、他人が投稿したものを編集しようとした場合はトップページへリダイレクトすることにします。

app\Http\Controllers

投稿を削除する機能を追加する

削除するときもログインしていないユーザーであればコンストラクタの記述により削除処理は行なわれませんが、ログインしているユーザーの場合は他のユーザーの投稿であっても削除できてしまいます。そこで投稿文を編集するときと同様、投稿文を作成したユーザーとログインしているユーザーのユーザーIDを比較し、一致しない場合は処理をおこなわずトップページにリダイレクトさせています。

app\Http\Controllers