PHPバージョン:7.1.14
Laravelバージョン:5.7.9
前回まででLaravelのResourceControllerを
モデルを指定して実装するところまで進みました!
今回は実際にResourceControllerでひとつサービスを作ってみたいと思います!
CRUDを実現します!
CRUDとは?
CRUD(クラッド)とは、Webサービスで基本となる4つの機能を指します。
C:Create。作成。
R:Read。読み取り。
U:Update。更新。
D:Delete。削除
Controller
まずは前回作成したControllerの
全てのメソッドの中身を書いていきます!
<?php namespace App\Http\Controllers; use App\Models\Article; use Illuminate\Http\Request; class ResController extends Controller { public function index() { $articles = Article::all(); return view('res.index', ['articles' => $articles]); } public function create() { return view('res.create'); } public function store(Request $request) { Article::create([ 'title' => $request->title, 'body' => $request->body, ]); return redirect('articles'); } public function show(Article $article) { return view('res.show', ['article' =>$article]); } public function edit(Article $article) { return view('res.edit', ['article' => $article]); } public function update(Request $request, Article $article) { $article->fill($request->all())->save(); return view('res.show', ['article' => $article]); } public function destroy(Article $article) { $article->delete(); return redirect('articles'); } }
app>Http>Controllers>ResController.php
indexメソッドで記事一覧ページを表示します。
全てのArticleモデルを読み込み、
viewメソッドに引数として渡しindexビューを表示します。
[GET URL:/articles]
createメソッドで記事作成ページを表示します。
createビューを表示します。
[GET URL:/articles/create]
storeメソッドで記事を作成(DBに保存)します。
作成後は記事一覧ページを表示します。
[POST URL:/articles]
showメソッドで単一記事の詳細ページを表示します。
引数として受け取ったArticleモデル情報をshowビューへ渡します。
[GET URL:/articles/{article_id}]
editメソッドで単一記事の編集ページを表示します。
Articleモデル情報をeditビューへ渡します。
[GET URL:/articles/{article_id}/edit]
updateメソッドでeditページで変更した内容に更新(DBに上書き保存)します。
fillメソッドを使うことで引数に指定した項目を上書きできます。
saveメソッドでDBに保存します。
上書き保存が終わったらshowページへ移動します。
[PUT URL:/articles/{article_id}]
destroyメソッドで指定した記事を削除します。
引数として受け取ったArticleモデルをdeleteメソッドでDBから削除します。
削除後、記事一覧ページへ移動します。
[DELETE URL:/articles/{article_id}]
View
続いてはViewの作成です!
index.blade.php
まずは記事一覧を表示するindexビューからです!
resources>views>resディレクトリにindex.blade.phpファイルを作成してください!
<!doctype html> <html> <head> <title>INDEX</title> </head> <body> <h1>記事一覧</h1> <p><a href="/articles/create">記事作成</a></p> <form method="POST"> {{ csrf_field() }} {{method_field('DELETE')}} @foreach($articles as $article) <p><a href="/articles/{{$article->id}}">タイトル:{{$article->title}}</a><br/> <input type="submit" value="削除" formaction="/articles/{{$article->id}}"></p> @endforeach </form> </body> </html>
resources>views>res>index.blade.php
ResControllerのindexメソッドで渡した$articlesをforeach文で回し、
{{$article->title}}にて各記事のタイトルを表示します。
また各タイトルに"/articles/{article_id}"のリンクを貼ります。
このリンクをクリックするとResControllerのshowメソッドが実行されます。
foreach文2行目には削除用のボタンを作成しています。
こちらのformのmethodはPOSTですが、form内の先頭に
{{method_field('DELETE')}}
と書くことでDELETEに変更されます。
これによって削除ボタンが正常に機能します。
create.blade.php
続いて記事作成をページのcreateビューです!
resources>views>res>create.blade.phpを作成します!
<!doctype html> <html> <head> <title>CREATE</title> </head> <body> <h1>記事作成</h1> <form action="/articles" method="POST"> {{ csrf_field() }} <p>タイトル: <input type="text" name="title"></p> <p>本文: <textarea type="text" name="body" rows="4" cols="40"></textarea></p> <p><input type="submit" value="作成"></p> </form> <a href="/articles">INDEXへ戻る</a> </body> </html>
resources>views>res>create.blade.php
formのactionを"/articles"、methodを"POST"とすることで、
作成ボタンを押した時にResControllerのstoreメソッドを呼び出します。
show.blade.php
続いて1つの記事の詳細ページを表示するshowビューです!
<!doctype html> <html> <head> <title>SHOW</title> </head> <body> <h1>記事詳細</h1> <p>タイトル:{{$article->title}}</p> <p>本文:{{$article->body}}</p> <a href="/articles/{{$article->id}}/edit">編集</a> <a href="/articles">戻る</a> </body> </html>
resources>views>res>create.blade.php
引数として受け取った$articleの内容を表示します。
"/articles/{article_id}/edit"へリンクされた編集を押すと、
editページへ遷移します。
edit.blade.php
最後に記事を編集するeditビューです!
<!doctype html> <html> <head> <title>EDIT</title> </head> <body> <h1>記事編集</h1> <form action="/articles/{{$article->id}}" method="POST"> {{csrf_field()}} {{method_field('PUT')}} <p>タイトル:<input type="text" name="title" value="{{$article->title}}" cols="40"></p> <p>本文:<textarea type="text" name="body" rows="4" cols="40">{{$article->body}}</textarea></p> <p><input type="submit" value="更新"></p> </form> <a href="/articles/{{$article->id}}">戻る</a> </body> </html>
resources>views>res>edit.blade.php
{{method_field('PUT')}}
をformの先頭に書くことで、
form送信時のmethodをPUTにします。
method=PUT、action="/articles/{article_id}"のリクエストを送り、
ResControllerのupdateメソッドが呼ばれます。
Route
最後にRouteファイルであるroutes>web.phpを編集します!
<?php Route::resource('articles', 'ResController');
routes>web.php
この一行で
index, create, store, show, edit, update, destroy全てのルートに対応します。
以上でResourceControllerを使いCRUDが実現されました!
今回はここまでです、ありがとうございました〜!