Laravelのコントローラで$idによるfindせずにモデルを渡す!

find

findを書かずにモデルをアクションに渡す

下記のように、コントローラのパラメータとして$idを渡すのがLaravelの標準の書き方にはなりますが、モデルを渡すことができます。また、$postが見つからなかった場合は、NotFoundExceptionを投げてくれます。各コントローラとアクションで1行を減らすことができるのでだいぶソースコードがスッキリします。routeはresouceを使用すれば特に設定は必要ないですが、routeでurlを設定する時に{id}ではなく、{post}とする必要がありますのでそこだけ注意が必要です。

//Laravelの標準の書き方
public function destroy($id)
    {
        $post = Post::findOrFail($id);
        $post->delete();
        return back()->with('success', __('message.success'));
    }
//パラメータにモデルを渡す
public function destroy(Post $post)
    {
        $post->delete();
        return back()->with('success', __('message.success'));
    }

下記がコントローラ全体になります。

<?php

namespace App\Http\Controllers;

use App\Post;
use App\Http\Requests\PostRequest;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index()
    {
        $posts = Post::all()
        return view('post.index', compact('posts'));
    }

    public function create()
    {
        return view('post.edit');
    }

    public function store(PostRequest $request)
    {
        $post = Post::create($request->all());

        return redirect()->route('post.show', compact('post'))->with('success', __('message.success'));
    }

    public function show(Post $post)
    {
        return view('post.show', compact('post'));
    }

    public function edit(Post $post)
    {
        return view('post.edit', compact('post'));
    }

    public function update(PostRequest $request, Post $post)
    {
        $post->update($request->all());
        return back()->with('success', __('message.success'));
    }

    public function destroy(Post $post)
    {
        $post->delete();
        return back()->with('success', __('message.success'));
    }
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です