Laravel5.4: usersのCRUD機能を実装する

  • 0
    いいね
  • 0
    コメント

    usersテーブルに関するCRUD機能を実装します。

    親記事

    Laravel 5.4で基本的なCRUDを作る - Qiita

    usersのEloquentモデルを生成する

    モデル定義

    usersテーブルの場合は、既存のapp/User.phpがあるのでモデル生成は不要です。
    なお、他のテーブルの場合は下記のようにして生成します。

    PowerShell
    > php artisan make:model Post
    

    app/Post.phpが生成されます。

    usersのコントローラーを生成する

    リソースコントローラ

    今回は、典型的なCRUD機能を提供してくれるリソースコントローラを利用させてもらいます。

    PowerShell
    > php artisan make:controller UserController --resource
    

    app/Http/Controllers/UserController.phpが生成され、CRUDに関するアクションメソッドも自動で定義されています。
    あとは中身の処理を書くだけです。

    ルーティングを設定する

    routes/web.php
    Route::resource('users', 'UserController');
    

    上の一行で下記のようにCRUDに関するルートがまとめて設定されます。

    動詞 URI アクション ルート名
    GET /users index users.index
    GET /users/create create users.create
    POST /users store users.store
    GET /users/{user} show users.show
    GET /users/{user}/edit edit users.edit
    PUT/PATCH /users/{user} update users.update
    DELETE /users/{user} destroy users.destroy

    Eloquentモデルをインポートする

    コントローラ内で頻繁に使うことになるのでインポートしておきます。

    app/Http/Controllers/UserController.php
        namespace App\Http\Controllers;
    
        use Illuminate\Http\Request;
    +   use App\User;
    
        class UserController extends Controller
        {
    

    一覧表示 (index)

    モデルの取得

    ここからは、CRUDの機能をひとつひとつ実装していきます。

    コントローラ

    indexアクションの中身を下記のようにします。

    app/Http/Controllers/UserController.php
    public function index()
    {
        $users = User::all();
        return view('users.index', ['users' => $users]);
    }
    

    ビュー

    ビュー

    resources/views/users/フォルダを作り、その中にindex.blade.phpを作ります。

    resources/views/users/index.blade.php
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>Name</th>
                <th>Email</th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach ($users as $user)
                <tr>
                    <td>{{ $user->id }}</td>
                    <td>{{ $user->name }}</td>
                    <td>{{ $user->email }}</td>
                    <td>
                        <a href="{{ url("users/{$user->id}") }}">
                            Show
                        </a>
                        <a href="{{ url("users/{$user->id}/edit") }}">
                            Edit
                        </a>
                        <a href="{{ url("users/{$user->id}") }}">
                            Delete
                        </a>
                    </td>
                 </tr>
            @endforeach
        </tbody>
    </table>
    

    1件だけを表示 (show)

    1モデル/集計の取得

    コントローラ

    モデル結合ルート (Route Model Binding)

    app/Http/Controllers/UserController.php
    public function show(User $user)
    {
        return view('users.show', ['user' => $user]);
    }
    

    ビュー

    resources/views/users/show.blade.php
    <table>
        <tbody>
            <tr>
                <th>ID</th>
                <td>{{ $user->id }}</td>
            </tr>
            <tr>
                <th>Name</th>
                <td>{{ $user->name }}</td>
            </tr>
            <tr>
                <th>Email</th>
                <td>{{ $user->email }}</td>
            </tr>
        </tbody>
    </table>
    

    追加 (create, store)

    コントローラ

    Inserts

    app/Http/Controllers/UserController.php
    // 追加用のフォーム画面へ移動
    public function create()
    {
        return view('users.create');
    }
    
    // 実際の追加処理
    // 終わったら、作ったばかりのユーザのページへ移動
    public function store(Request $request)
    {
        $user = new User;
        $user->name = $request->name;
        $user->email = $request->email;
        $user->password = $request->password;
        $user->save();
        return redirect("users/{$user->id}");
    }
    

    ビュー

    CSRF保護
    疑似フォームメソッド

    resources/views/users/create.blade.php
    <form action="{{ url('users') }}" method="post">
        {{ csrf_field() }}
        {{ method_field('POST') }}
        <p>
            <label for="name">Name:</label><br>
            <input type="text" name="name">
        </p>
        <p>
            <label for="email">Email:</label><br>
            <input type="email" name="email">
        </p>
        <p>
            <label for="password">Password:</label><br>
            <input type="password" name="password">
        </p>
        <p>
            <input type="submit" value="Submit">
        </p>
    </form>
    

    更新 (edit, update)

    Updates

    コントローラ

    app/Http/Controllers/UserController.php
    // 更新用フォーム画面へ移動
    public function edit(User $user)
    {
        return view('users.edit', ['user' => $user]);
    }
    
    // 実際の更新処理
    // 終わったら、そのユーザのページへ移動
    public function update(Request $request, User $user)
    {
        $user->name = $request->name;
        $user->email = $request->email;
        $user->save();
        return redirect("users/{$id}");
    }
    

    ビュー

    method_field()PUTを指定する以外はcreate.blade.phpと同じです。

    resources/views/users/edit.blade.php
    <form action="{{ url("users/{$user->id}") }}" method="post">
        {{ csrf_field() }}
        {{ method_field('PUT') }}
        <p>
            <label for="name">Name:</label><br>
            <input type="text" name="name" value="{{ $user->name }}">
        </p>
        <p>
            <label for="email">Email:</label><br>
            <input type="email" name="email" value="{{ $user->email }}">
        </p>
        <p>
            <input type="submit" value="Submit">
        </p>
    </form>
    

    削除 (destroy)

    モデル削除

    コントローラ

    app/Http/Controllers/UserController.php
    public function destroy(User $user)
    {
        $user->delete();
        return redirect('users');
    }
    

    ビュー

    コンポーネントとスロット

    削除ボタンは複数のビューで使うので、コンポーネントとして作ります。

    resources/views/form-del.blade.php
    <form class="js-form-del" action="{{ url("{$table}/{$id}") }}" method="post">
        {{ csrf_field() }}
        {{ method_field('DELETE') }}
        <input type="submit" value="Delete">
    </form>
    

    コンポーネントを呼び出す側は下記のように。

    @component('form-del')
        @slot('table', 'users')
        @slot('id', $user->id)
    @endcomponent
    

    完了

    認証(ログイン、ログオン)もバリデーションもありませんが、とりあえずCRUDの根幹はできあがりました。