[Laravel 8]  Eloquentを用いたCRUD記述まとめ (Controller, Routing, View, Validate, Model)

#はじめに
Controller, Routing, View, Validate, Modelの記述をEloquentベースでまとめました。
(index,show,edit,create,store,update,destroy)
laravel8 を想定しています。

# Routing

```php:web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;

//showのみ laravel8.0
Route::get('/post/{id}', [PostController::class, 'show'])->name('posts.show');
Route::resource('posts', PostController::class)->only(['show']);
//showのみ laravel6.0
Route::get('/post/{id}', 'PostController@show')->name('posts.show');
Route::resource('posts', 'PostController')->only(['show']);

//全て
Route::resource('posts', PostController::class);

//index以外全て
Route::resource('posts', PostController::class)->except(['index']);

//ログイン中のみ全て
Auth::routes();
Route::resource('posts', PostController::class)->middleware('auth');

//ログイン中のみ全て（グループ)
Auth::routes();
Route::middleware(['auth'])->group(function () {
Route::resource('posts', PostController::class);
    });

//controllerを介さない
Route::get('/home',function (){
    return view('home');
})->name('home');
```

# View
```php:all.blade.php
//index
<a href="{{ route('posts.index') }}">一覧</a>

//show
<a href="{{ route('posts.show', $post->id) }}">詳細</a>

//edit 2パターン
<form method="GET" action="{{ route('posts.edit', $post->id) }}">
<input type="submit"value="編集">
</form>

<a href="{{ route('posts.edit', $post->id) }}">新規編集</a>

//create
<a href="{{ route('posts.create') }}">新規登録</a>

//store
<form action="{{ route('posts.store') }}" method="post">
@csrf
<input type="submit"value="投稿">
</form>

//update
<form method="POST" action="{{ route('posts.update', $post->id) }}">
@csrf
@method('PATCH')
<input type="submit"value="更新">
</form>

//destroy
<form method="POST" action="{{ route('posts.destroy', $post->id) }}">
@csrf
@method('DELETE')
<input type="submit"value="削除">
</form>
```

# PostController


```php:PostController.php
<?php
namespace App\Http\Controllers;

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

//use Illuminate\Support\Facades\Auth;

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

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

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

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

    public function store(PostRequest $request, Post $post)
    {
        //postのuser_idが不要の場合
        $post->fill($request->all())->save();
        return redirect(route('posts.index'));

        //postのuser_idが必要の場合
        $post->fill($request->all());
        $post->user_id = $request->user()->id;
        $post->save();
        return redirect(route('posts.index'));
    }

    public function update(PostRequest $request, Post $post)
    {
      $post->fill($request->all())->save();
      return redirect(route('posts.index'));
    }

    public function destroy(Post $post)
    {
        $post->delete();
        return redirect(route('posts.index'))->with('success','削除しました');
    }
}
```

`public function store(PostRequest $request, Post $post)`とすることで、
PostRequestとPostクラスのインスタンスが自動で生成されてメソッド内で使えるようになります。
そのため、メソッド内の`$post = new Post();`が省略できます。

editの場合は、editメソッドが呼び出された時のURIがposts/1/editであれば、idが1であるPostモデルのインスタンスが代入されます。
`$post = Post::find(1)`が省略できます。

# PostRequest
バリデーションはコントローラからリクエストクラスに移動させます。
4点を記述します。
・authorizeメソッド内をtrueに変更
・バリデーションの内容記入
・バリデーションのエラーメッセージに表示される項目名を変更
・エラーメッセージ内容を変更

```PostRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class PostRequest extends FormRequest
{
    /**
     * Determine if the post is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;  //false->trueに変更しておく
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */

//バリデーションの内容記入
    public function rules()
    {
        return [
            'content' => 'required|string|max:50',
            'title' => 'required|string|max:50',
        ];
    }
 //バリデーションのエラーメッセージに表示される項目名を変更
    public function attributes()
    {
        return [
            'content' => '内容',
            'title' => 'タイトル',
        ];
    }
//エラーメッセージ内容を変更
    public function messages()
    {
        return [
            'content.required' => '内容を入力してください',
            'title.required' => 'タイトルを入力してください',

        ];
    }

}

```
rulesメソッドは、バリデーションのルールを定義します。

attributesとmessagesメソッドは、バリデーションのエラーメッセージに表示される項目名、内容をカスタマイズします。
resources/lang/ja or en/validation.phpファイル内は全てに反映されますが、個別のviewに反映したい場合はここでカスタマイズします。

#PostModel
$fillableに指定したカラムのみ、`fill()、update(),create()`で値が代入されます。

```Post.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = [
            'title',
            'content'
    ];
}
```

#参考記事
[LaravelのORMで初心者から職人へ]
(https://qiita.com/henriquebremenkanp/items/cd13944b0281297217a9)
[Eloquent をおさらい]
(https://qiita.com/shosho/items/5ca6bdb880b130260586)
[Laravelベストプラクティス]
(https://github.com/alexeymezenin/laravel-best-practices/blob/master/japanese.md)