初めてのLaravel ~Blog App~ 05 (備忘録)


**[渋谷で働くエンジニア福さん](https://www.youtube.com/channel/UCqzJi2o7bAPtRD3tTFvi7zA)のYoutube動画,[実践で学ぶプログラミング入門](https://youtu.be/yaitzPzBzuI) の学習記録です。**
<h2>ブログ投稿機能</h2>
<流れ>
1, Routeの作成

```php
//ブログ投稿画面を表示
Route::get('/blog/create', 'BlogController@showCreate') ->name('create');
//ブログ登録
Route::post('/blog/store', 'BlogController@exeStore') ->name('store');
```
2, csrf対策
***csrfとは？***
”ウェブアプリケーションの脆弱性を悪用するサイバー攻撃の一種”
3, Controllerで処理を記述

```php 
//ブログ登録ページ(form)の表示
public function showCreate(){
        return view('blog.form');
    }

//ブログ登録処理
public function exeStore(BlogRequest $request)
    {
        $inputs = $request->all(); //データを受け取る

        \DB::beginTransaction(); //エラーの場合は登録処理を停止する
        try {
            Blog::create($inputs); //ブログを登録
            \DB::commit();

        }catch(\Throwable $e){ 
　　　　　//DB接続が上手くいかなかった時は500エラーのページを表示
　　　　　//本来はログ出力で不具合を修正
            \DB::rollback();
            abort(500);
        }

        \Session::flash('err_msg', 'ブログを投稿しました。');
        return redirect(route('blogs'));
    }
```
4, Validationsの設定
コマンドから`php artisan make:request BlogRequest`でリクエストファイルの作成し、ルールを記述

```php
public function rules()
    {
        return [
            'title' => 'required | max:100',
            'content' => 'required'
        ];
    }
```

エラーメッセージを日本語対応に設定
[参照ドキュメント](https://readouble.com/laravel/6.x/ja/validation-php.html?header=%25E8%25AA%25AC%25E6%2598%258E)
また、カスタム属性も日本語に設定

```php:resources/lag/ja/validation.php
'attributes' => [
        'title' => 'タイトル',
        'content' => 'ブログ内容',
    ],
```


<h2>ブログ編集機能</h2>
<流れ>
1, 編集ページへのリンクボタンの作成 (list.blade.php)
`<td><button type="button" class="btn btn-primary" onclick="location.href='/blog/edit/{{ $blog->id} }'">編集</button></td>`

2, Routeの設定
3, Controllerで処理を記述(function showDetail() の内容とほぼ同じ)
4, 編集ページの作成(投稿フォームを使い回す)
 *editFormでidを送る処理を
`<input type="hidden" name="id" value="{{ $blog->id }}"
`で追加しておく。
5, Controllerで更新処理を記述(function exeStore(BlogRequest $request)の内容とほぼ同じ)

```php
public function exeUpdate(BlogRequest $request)
    {
        $inputs = $request->all(); //データを受け取る
        
        \DB::beginTransaction();
        try {
            $blog = Blog::find($inputs['id']);
            $blog->fill([
                'title' => $inputs['title'],
                'content' => $inputs['content'],
            ]);
            $blog->save(); //updateメソッドと違って、差分があれば更新される
            \DB::commit();
        } catch (\Throwable $e) {
            \DB::rollback();
            abort(500);
        }

        \Session::flash('err_msg', 'ブログを更新しました。');
        return redirect(route('blogs'));
    }
```

<h2>ブログ削除機能</h2>
1, Routeの作成
ブログ一覧ページで削除ボタンの設置

```php
<form method="POST" action="{{ route('delete', $blog->id) }}" 
 onSubmit="return checkDelete()">
  @csrf
  <td>
   <button type="submit" class="btn btn-danger">削除</button>
  </td>

//一番最後の</div>の後に
<script>
  function checkDelete() {
    if (window.confirm('削除してよろしいですか？')) {
      return true;
    } else {
      return false;
    }
  }
</script>

```

```php
//ブログ削除
Route::post('/blog/delete/{id}', 'BlogController@exeDelete')->name('delete');
```
2,Controllerで削除処理を記述

```php
    /**
     * ブログ削除
     * @param int $id
     * @return view
     */
    public function exeDelete($id)
    {
        
        if (empty($id)) {
            \Session::flash('err_msg', 'データがありません。');
            return redirect(route('blogs'));
        }

        try {
            Blog::destroy($id);
        }catch(\Throwable $e) {
            abort(500);
        }
        \Session::flash('err_msg', 'ブログを削除しました。');
        return redirect(route('blogs'));
         
    }
```