YuHo のブログ

Laravel, PHP, JavaScript

Laravel 5.6 でブログサイトを制作する2 #10 Redirect を高機能にする

今回は既存アプリの PostController と CommentController の Redirect をより高機能にします。

開発

PostController

もしログインユーザーが Post の update を認可されるなら、Redirect はユーザーをその Post のページへ送るようにします。
これまではトップページへ飛ばすようになっていました。
逆に Post の update が許可されないなら、ユーザーをフォーム入力情報付きで前回のページへ飛ばします。
上の2つは意味がほぼ同じですが、学習のために2通りの方法で実現してみました。
destroy のほうもほぼ同じ要領で開発します。

[blog/app/Http/Controllers/PostController.php]

<?php

public function update(Request $request, Post $post)
{
    if ($request->user()->can('update', $post)) {
        $post->title = $request->input('title');
        $post->content = $request->input('content');
        $post->save();

        return redirect()->route('posts.show', ['post' => $post]);
    } else {
        return back()->withInput();
    }
}

public function destroy(Request $request, Post $post)
{
    if ($request->user()->can('delete', $post)) {

        return redirect()->route('users.show', ['user' => $post->user_id]);
    } else {
        return back();
    }
}

CommentController

CommentController の開発は PostController のそれとほぼ同じ手順です。

[blog/app/Http/Controllers/CommentController.php]

<?php

public function update(Request $request, Comment $comment)
{
    if ($request->user()->can('update', $comment)) {

        $comment->content = $request->input('content');

        $request->user()->comments()->save($comment);

        return redirect()->route('posts.show', ['post' => $comment->post_id]);
    } else {
        return back()->withInput();
    }
}

public function destroy(Comment $comment)
{
    if ($request->user()->can('delete', $comment)) {
        $comment->delete();

        return redirect()->route('posts.show', ['post' => $comment->post_id]);
    } else {
        return back();
    }
}

解説

ユーザーを直前の位置に送る

  1. back() メソッドを利用する
  2. それをリターンする
<?php

return back();

ユーザーを名称 Route に送る

  1. 引数を持たない redirect() メソッドに route() メソッドを鎖付けする
  2. route() の第一引数は Route の名称
  3. 第二引数に Route パラメータを渡すこともできる
<?php

return redirect()->route('home');
// return redirect()->route('users.show', ['user' => $id]);

名称 Route のパラメータにモデルの id を入れる

  1. route() メソッドの第二引数にモデルのインスタンスを渡す
  2. モデルのインスタンスから id プロパティが自動的に引き出される
<?php
return redirect()->route('users.show', [$user]);