Laravel 課題2・メールアドレス帳の作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/195d5576-b411-c401-a2d6-95f86db246e3.png)


# csvファイル

storage/app/**address_list.csv**

```php
山田太郎,東京都港区,t.yamada@test.com
佐藤花子,東京都杉並区,h.sato@test.com
山本二郎,東京都豊島区,j.yamamoto@test.com
田中三郎,神奈川県横浜市,s.tanaka@test.com
斎藤さくら,東京都台東区,s.saitou@test.com
加藤桃,東京都世田谷区,m.kato@test.com
k,k,k


```


# ルーティング

/routes/**web.php**

```php
<?php
Route::get('/address_list', 'SampleController@addressList');

Route::post('/address_list', 'SampleController@addressWrite');
```

# コントローラー

app/Http/Controllers/**SampleController.php**

```php
<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
 
class SampleController extends Controller{

   public function addressList(){
      // SplFileObjectの作成
      $file = new \SplFileObject(storage_path('app/address_list.csv'));
 
      // 読み込み設定
      $file->setFlags(
        \SplFileObject::READ_CSV | // CSVを配列形式で読み込む
        \SplFileObject::READ_AHEAD |
        \SplFileObject::SKIP_EMPTY | // 前の行と合わせて、空行があったら読み飛ばす
        \SplFileObject::DROP_NEW_LINE // 改行コードは無視する
      );
      // 1行ずつ読み込んで配列に保存
      $members = [];
      foreach($file as $member){
        $members[] = $member;
      }
 
      return view('samples.address_list', [
        'title' => 'メールアドレス帳',
        'members' => $members,
      ]);
    }
  
  
  // ----書き込み-------------------------------------------------------------------
  
   public function addressWrite(Request $request){
      // SplFileObjectを追記モードで作成
      $file = new \SplFileObject(storage_path('app/address_list.csv'), 'a');

      // 送信データから書き込み用の配列を作成
      $member = [
        $request->input('name'),
        $request->input('address'),
        $request->input('mail'),
      ];
      // csvファイルに書き込み
      $file->fputcsv($member);

      // 一覧表示画面にリダイレクト
      return redirect('/address_list');

    }
 }
```

# ビュー

resources/views/samples/**csv_sample.blade.php**

```php
@extends('layouts.default')
 
@section('title', $title)
 
@section('content')
<h1>{{ $title }}</h1>
 

  <form method="post" action="{{ url('/address_list') }}">
  @csrf
  <div>
    <label>
      名前:
      <input type="text" name="name">
    </label>
  </div>
  <div>
    <label>
      住所:
      <input type="text" name="address">
    </label>
  </div>
  <div>
    <label>
      メールアドレス:
      <input type="text" name="mail">
    </label>
  </div>
  <div>
    <input type="submit" name="登録">
  </div>
</form>
 
 <table>
        <tr>
          <th>名前</th>
          <th>住所</th>
          <th>メールアドレス</th>
        </tr>
    
    @foreach($members as $member)    
     <tr>
         <td> {{ $member[0] }} </td>
         <td> {{ $member[1] }} </td>
         <td> {{ $member[2] }} </td>
    </tr>
    @endforeach
    </table>

@endsection

```

# 共通レイアウトファイル

```PHP
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>@yield('title')</title>
    <style>
        .header_nav {
            display: flex;
            list-style: none;
            padding-left: 0;
        }
        .header_nav li {
            margin-right: 30px;
        }
        /* エラーメッセージ用のスタイル */
        .error {
          color: red;
        }
    </style>
</head>
<body>
    @yield('header')
 
    {{-- エラーメッセージを出力 --}}
    @foreach($errors->all() as $error)
      <p class="error">{{ $error }}</p>
    @endforeach
 
    @yield('content')
</body>
</html>
```