Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Laravel】ResourceController実践!CRUDを実現!

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に変更されます。
これによって削除ボタンが正常に機能します。

f:id:hiyotama:20181113171113p:plain

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メソッドを呼び出します。

f:id:hiyotama:20181113171336p:plain

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ページへ遷移します。

f:id:hiyotama:20181113172411p:plain

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メソッドが呼ばれます。

f:id:hiyotama:20181113172441p:plain

Route

最後にRouteファイルであるroutes>web.phpを編集します!

<?php

Route::resource('articles', 'ResController');

routes>web.php

この一行で
index, create, store, show, edit, update, destroy全てのルートに対応します。

f:id:hiyotama:20181023163815p:plain


以上でResourceControllerを使いCRUDが実現されました!

今回はここまでです、ありがとうございました〜!