概要
SplFileObject
によるCSVファイルへの書き出しについて整理する。
- ファイル名を指定して
SplFileObject
のインスタンスを生成$file = new \SplFileObject('CSVファイルパス', 'a');
$open_mode='a'
(書き出し・追記)を設定
- アクションの引数で指定したRequestオブジェクトからフォームパラメーターを読み込み、CSV書込み用の配列変数にセット
$request->input('INPUT要素名');
- 配列の内容をファイルへ書き出し
$file.fputcsv(1行分の配列変数);
- 必要に応じて引数で区切り・囲み・エスケープ記号を指定
- ファイルをクローズ
$file = null;
- 更新後のデータで表示するようリダイレクト
基本例
例として以下のようなアプリケーションを考える。CSVファイルの読み込み手順は”CSV – 読み込み“の内容と同じ。
- GETリクエストに応じて
- 入力フォームを表示する
- フォームの下にCSVファイルの内容を表示する
- フォームに入力し送信ボタンを押してPOSTリクエスト
- 入力された内容をCSVファイルに追加書き出し
- 更新後のデータを表示するためリダイレクト
ルーティング
以下の様にルーティングする。
1 |
Route::get('/csv_sample', 'SampleController@csvRead'); |
コントローラー~GET・表示処理
“CSV – 読み込み“と同じ手順でCSVファイルを読み込み、ビューに引き継ぐ。
SplFileObject
インスタンスの生成storage/app
ディレクトリーに配置したCSVファイルを指定storage_path()
関数を利用してパスを取得
- CSV読み込みのためのフラグセット
- 行単位で読み込み配列に格納
- データをビューに引き継いでレンダリング
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public function csvRead() { $file = new \SplFileObject(storage_path('app/csv_sample_utf8.csv')); $file->setFlags( \SplFileObject::READ_CSV | \SplFileObject::READ_AHEAD | \SplFileObject::SKIP_EMPTY | \SplFileObject::DROP_NEW_LINE ); $lines = []; foreach($file as $line) { $lines[] = $line; } $file = null; $vars = [ 'title' => 'CSVサンプル', 'lines' => $lines, ]; return view('samples.csv_sample', $vars); } |
ビュー
表示
この例でのビューの表示内容は以下の2つ
- CSVファイルに追加するデータのフォーム
- コントローラーから引き継いだCSV読み込みデータの内容を表示
ビューのうちbody
要素内のBladeコードは以下のとおり。form
要素内の冒頭に@csrf
でCSRF対策を指定している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<h1>{{ $title }}</h1> <form action="/csv_sample" method="post"> @csrf <p><input type="text" name="branch" placeholder="支店名"></p> <p><input type="text" name="location" placeholder="所在市町村"></p> <p><input type="text" name="tel" placeholder="電話番号"></p> <input type="submit" value="保存"> </form> <hr> @foreach($lines as $line) <p>{{ $line[0] }}, {{ $line[1] }}, {{ $line[2] }}</p> @endforeach |
CSVにデータが2行だけ登録されている状態の、ブラウザーの表示例は以下のとおり。
フォーム入力・POST
上記のフォームに追加するデータを入力し、保存ボタンで登録のためのPOSTリクエスト。
コントローラー~POST・登録処理
ビューのフォームからPOSTされたパラメーターを、CSVファイルに追加する。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public function csvWrite(Request $request) { $file = new \SplFileObject(storage_path('app/csv_sample_utf8.csv'), 'a'); $line = [ $request->input('branch'), $request->input('location'), $request->input('tel'), ]; $file->fputcsv($line); $file = null; return redirect('/csv_sample'); } |
POSTパラメーターの取得・変数セット
- アクションの引数で
Request
オブジェクトを受け取り、input()メソッドで各パラメーターを取得 - 取得したパラメーターを行データの配列にセット
行データのCSVファイルへの追加
fputcsv()
メソッドで行データをCSVファイルに追加- 追加後に
SplFileObject
の変数にnull
を代入し、ファイルクローズ相当の処理をしている
リダイレクト
保存されたCSVデータが反映された状態で再表示するため、リダイレクトを指示している。
return redirect('ルーティング先');
view()
によるレンダリングはビューファイルを指定して再表示redirect()
によるリダイレクトはルーティング設定のURIを指定してコントローラーから実行
再表示結果
CSVファイルに追加されたデータが反映されている。