20210609のlaravelに関する記事は10件です。

【Laravel】フォームリクエストのエラーレスポンスを json で返す

API リクエストのバリデーションをフォームリクエストで行うとき、バリデーションエラーのときのレスポンスが意図していたものと違った( json で返ってこなかった)ので、 json でレスポンスされる方法を調べてみました。 エラーレスポンスを json で返す エラーレスポンスの定義はfailedValidationメソッドをオーバーライドして書きます(ここがミソです)。failedValidationメソッドをオーバーライドしていないと、バリデーションエラーの場合にホームにリダイレクトされたりします。 <?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; // ↓追加する use Illuminate\Contracts\Validation\Validator; use Illuminate\Http\Exceptions\HttpResponseException; class ApiValidation extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'title' => 'required' ]; } /** * エラー時のレスポンスを定義 */ protected function failedValidation(Validator $validator) { $res = response()->json([ 'status' => 400, 'errors' => $validator->errors(), ], 400); throw new HttpResponseException($res); } } 参考記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel 課題1・郵便番号辞書

郵便番号の一覧データを読み込み、 郵便番号 都道府県 市区町村 町域 のデータを表示する画面を作成してください。 csvファイル /storage/app/zip_data_split_1.csv "0600000","ホッカイドウ","サッポロシチュウオウク","イカニケイサイガナイバアイ","北海道","札幌市中央区","以下に掲載がない場合" "0640941","ホッカイドウ","サッポロシチュウオウク","アサヒガオカ","北海道","札幌市中央区","旭ケ丘" "0600041","ホッカイドウ","サッポロシチュウオウク","オオドオリヒガシ","北海道","札幌市中央区","大通東" "0600042","ホッカイドウ","サッポロシチュウオウク","オオドオリニシ(1-19チョウメ)","北海道","札幌市中央区","大通西(1〜19丁目 ルーティング /routes/web.php <?php Route::get('/zipcode_list', 'SampleController@zipcodeList'); コントローラー app/Http/Controllers/SampleController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class SampleController extends Controller{ public function zipcodeList(){ // SplFileObjectの作成 $file = new \SplFileObject(storage_path('app/zip_data_split_1.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.zipcode_list', [ 'title' => '郵便番号一覧', 'members' => $members, ]); } } ビュー resources/views/samples/zipcode_list.blade.php <style> table { border-collapse: collapse; } th, td { border: solid 1px black; padding: 5px; } </style> @extends('layouts.default') @section('title', $title) <h1>{{ $title }}</h1> @section('content') <table> <tr> <th>郵便番号</th> <th>都道府県</th> <th>市区町村</th> <th>町域</th> </tr> @foreach($members as $member) <tr> <td> {{ $member[0] }} </td> <td> {{ $member[4] }} </td> <td> {{ $member[5] }} </td> <td> {{ $member[6] }} </td> </tr> @endforeach </table> @endsection
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】SQL発行回数を減らす 〜複数レコードを一気にDBへ保存する方法〜

Laravelで複数レコードを保存する際、一度のSQL発行で処理する方法を考える。 現状は4つのレコードを保存する為に、4回SQLを発行している。 コードは以下の通り。 RoomController.php //1人目 $room_player_1 = RoomPlayer::create([ "name" => null, "room_id" => $room_id, "user_id" => 1, ]); //2人目 $room_player_2 = RoomPlayer::create([ "name" => null, "room_id" => $room_id, "user_id" => 2, ]); //3人目 $room_player_3 = RoomPlayer::create([ "name" => null, "room_id" => $room_id, "user_id" => 3, ]); //4人目 $room_player_4 = RoomPlayer::create([ "name" => null, "room_id" => $room_id, "user_id" => 4, ]); これを一度のSQL発行で処理するには、以下のようにデータを配列に格納し、insert( )で保存する。 ※ちなみに、save(), create() で複数データをテーブルに格納する場合, foreach() 等で繰り返し処理をする必要がある。 RoomController.php $players = [ ["name" => null, "room_id" => $room_id, "user_id" => 1], ["name" => null, "room_id" => $room_id, "user_id" => 2], ["name" => null, "room_id" => $room_id, "user_id" => 3], ["name" => null, "room_id" => $room_id, "user_id" => 4] ]; $save_players = RoomPlayer::insert($players);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel csvファイル読み込み・書き込み・コンバート 課題3・CSVの加工(難易度: 高)

csvファイル storage/app/members.csv 山田太郎,東京都港区,090-0000-0000 コンバート用csvファイル storage/app/members_converted.csv 0,東京都港区,090-0000-0000 1,東京都杉並区,090-2222-2222 2,東京都豊島区,090-3333-3333 ルーティング /routes/web.php <?php Route::get('/csv_sample', 'SampleController@csvSample'); Route::get('/csv_sample', 'SampleController@csvSample'); Route::post('/convert_csv', 'SampleController@convertCsv'); コントローラー app/Http/Controllers/SampleController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class SampleController extends Controller{ public function csvSample(){ // SplFileObjectの作成 $file = new \SplFileObject(storage_path('app/members.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.csv_sample', [ 'title' => 'CSV読み込みのサンプル', 'members' => $members, ]); } // ----書き込み------------------------------------------------------ public function csvWrite(Request $request){ $request->validate([ 'user_name' => ['required', 'max:20'], 'address' => ['required', 'max:100'], 'phone' => ['required', 'max:20'], ]); $file = new \SplFileObject(storage_path('app/members.csv'), 'a'); $member = [ $request->input('user_name'), $request->input('address'), $request->input('phone'), ]; $file->fputcsv($member); // flashメッセージの設定 session()->flash('success', 'メンバーを追加しました!'); return redirect('/csv_sample'); } // ----コンバート用 関数---------------------------------------- public function convertCsv(Request $request){ $members_file = new \SplFileObject(storage_path('app/members.csv')); $convert_file = new \SplFileObject(storage_path('app/members_converted.csv'), 'w'); $members_file->setFlags( \SplFileObject::READ_CSV | // CSVを配列形式で読み込む \SplFileObject::READ_AHEAD | \SplFileObject::SKIP_EMPTY | // 前の行と合わせて、空行があったら読み飛ばす \SplFileObject::DROP_NEW_LINE // 改行コードは無視する ); $members = []; foreach($members_file as $key => $member){ $row = [$key] + $member; $members[] = $row; } foreach($members as $member){ $convert_file -> fputcsv($member); } return redirect('/csv_sample'); } } ※追記モードでSplFileObjectを作成するには、第2引数を 'a' に設定。 これは「append(追加)」の省略形である。 ビュー resources/views/samples/csv_sample.blade.php @extends('layouts.default') @section('title', $title) @section('content') <h1>{{ $title }}</h1> <form method="post"> @csrf <div> <label> 名前: <input type="text" name="user_name"> </label> </div> <div> <label> 住所: <input type="text" name="address"> </label> </div> <div> <label> 電話番号: <input type="text" name="phone"> </label> </div> <div> <input type="submit" name="登録"> </div> </form> @foreach($members as $member) <p>{{ $member[0] }}: {{ $member[1] }} TEL: {{ $member[2] }}</p> @endforeach <form method="post" action="{{ url('/convert_csv') }}"> @csrf <input type="submit" value = "コンバート"> </form> @endsection dd は「dump and die(データを吐いて終了)」の省略形。 共通レイアウトファイル <!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; } /* 成功メッセージ用のスタイル */ .success { color: green; } </style> </head> <body> @yield('header') {{-- エラーメッセージを出力 --}} @foreach($errors->all() as $error) <p class="error">{{ $error }}</p> @endforeach {{-- 成功メッセージを出力 --}} @if (session()->has('success')) <div class="success"> {{ session()->get('success') }} </div> @endif @yield('content') </body> </html>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel csvファイル書き込み・書き込み・コンバート 課題3・CSVの加工(難易度: 高)

csvファイル storage/app/members.csv 山田太郎,東京都港区,090-0000-0000 コンバート用csvファイル storage/app/members_converted.csv 0,東京都港区,090-0000-0000 1,東京都杉並区,090-2222-2222 2,東京都豊島区,090-3333-3333 ルーティング /routes/web.php <?php Route::get('/csv_sample', 'SampleController@csvSample'); Route::get('/csv_sample', 'SampleController@csvSample'); Route::post('/convert_csv', 'SampleController@convertCsv'); コントローラー app/Http/Controllers/SampleController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class SampleController extends Controller{ public function csvSample(){ // SplFileObjectの作成 $file = new \SplFileObject(storage_path('app/members.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.csv_sample', [ 'title' => 'CSV読み込みのサンプル', 'members' => $members, ]); } // ----書き込み------------------------------------------------------ public function csvWrite(Request $request){ // バリデーション $request->validate([ 'user_name' => ['required', 'max:20'], 'address' => ['required', 'max:100'], 'phone' => ['required', 'max:20'], ]); $file = new \SplFileObject(storage_path('app/members.csv'), 'a'); $member = [ $request->input('user_name'), $request->input('address'), $request->input('phone'), ]; $file->fputcsv($member); return redirect('/csv_sample'); } // ----コンバート用 関数---------------------------------------- public function convertCsv(Request $request){ $members_file = new \SplFileObject(storage_path('app/members.csv')); $convert_file = new \SplFileObject(storage_path('app/members_converted.csv'), 'w'); $members_file->setFlags( \SplFileObject::READ_CSV | // CSVを配列形式で読み込む \SplFileObject::READ_AHEAD | \SplFileObject::SKIP_EMPTY | // 前の行と合わせて、空行があったら読み飛ばす \SplFileObject::DROP_NEW_LINE // 改行コードは無視する ); $members = []; foreach($members_file as $key => $member){ $row = [$key] + $member; $members[] = $row; } foreach($members as $member){ $convert_file -> fputcsv($member); } return redirect('/csv_sample'); } } ※追記モードでSplFileObjectを作成するには、第2引数を 'a' に設定。 これは「append(追加)」の省略形である。 ビュー resources/views/samples/csv_sample.blade.php @extends('layouts.default') @section('title', $title) @section('content') <h1>{{ $title }}</h1> <form method="post"> @csrf <div> <label> 名前: <input type="text" name="user_name"> </label> </div> <div> <label> 住所: <input type="text" name="address"> </label> </div> <div> <label> 電話番号: <input type="text" name="phone"> </label> </div> <div> <input type="submit" name="登録"> </div> </form> @foreach($members as $member) <p>{{ $member[0] }}: {{ $member[1] }} TEL: {{ $member[2] }}</p> @endforeach <form method="post" action="{{ url('/convert_csv') }}"> @csrf <input type="submit" value = "コンバート"> </form> @endsection dd は「dump and die(データを吐いて終了)」の省略形。 共通レイアウトファイル <!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>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel csvファイル書き込み

csvファイル storage/app/members.csv 山田太郎,東京都港区,090-0000-0000 ルーティング /アプリ名/routes/web.php <?php Route::get('/csv_sample', 'SampleController@csvSample'); Route::get('/csv_sample', 'SampleController@csvSample'); コントローラー app/Http/Controllers/SampleController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class SampleController extends Controller{ // csvファイルの読み込み ---------------------------------------- public function csvSample(){ // SplFileObjectの作成 $file = new \SplFileObject(storage_path('app/members.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.csv_sample', [ 'title' => 'CSV読み込みのサンプル', 'members' => $members, ]); } // ----書き込み------------------------------------------------------ public function csvWrite(Request $request){ // バリデーション $request->validate([ 'user_name' => ['required', 'max:20'], 'address' => ['required', 'max:100'], 'phone' => ['required', 'max:20'], ]); $file = new \SplFileObject(storage_path('app/members.csv'), 'a'); $member = [ $request->input('user_name'), $request->input('address'), $request->input('phone'), ]; $file->fputcsv($member); return redirect('/csv_sample'); } ※追記モードでSplFileObjectを作成するには、第2引数を 'a' に設定。 これは「append(追加)」の省略形である。 ビュー resources/views/samples/csv_sample.blade.php @extends('layouts.default') @section('title', $title) @section('content') <h1>{{ $title }}</h1> <form method="post"> @csrf <div> <label> 名前: <input type="text" name="user_name"> </label> </div> <div> <label> 住所: <input type="text" name="address"> </label> </div> <div> <label> 電話番号: <input type="text" name="phone"> </label> </div> <div> <input type="submit" name="登録"> </div> </form> @foreach($members as $member) <p>{{ $member[0] }}: {{ $member[1] }} TEL: {{ $member[2] }}</p> @endforeach @endsection dd は「dump and die(データを吐いて終了)」の省略形。 共通レイアウトファイル <!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>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel - Artisan::call()でTenancyのコマンドを呼び出せない

前提 Tenancyのバージョンは5.6を使用しています。 問題 あるファイルでArtisan::call()を使用してTenancyのartisanコマンドを呼び出そうするとエラーが出ます。 index.php Artisan::call('tenancy:db:seed'); エラー↓ Symfony\Component\Debug\Exception\FatalThrowableError : Class 'App\Console\Commands\Artisan' not found 解決方法 妥協案ではありますが、PHPのexec関数を使用したら動きました。 index.php exec('php artisan tenancy:db:seed'); Artisan::call()で正常に動作させる方法をご存知の方はコメントしていただけるとありがたいです。 参考 Tenancyとは異なるライブラリですが、下記のIssueを参考にしました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[ Docker ] Laravel × MongoDB × Nginx の環境構築を行う

はじめに 実際に開発現場で使用しているdockerの設定を元に環境構築手順をまとめる。 ディレクトリ構成 . ├── app ├── bootstrap ├── config ├── database ├── docker | ├── php | | ├── Dockerfile | | └── php.ini | └── nginx | └── default.conf ├── public ├── resources ├── routes ├── tests ├── docker-compose.yml | ... 以下省略 各ファイルの詳細 docker/php/Dockerfile FROM php:7.4-fpm RUN apt-get update \ && apt-get -y install libzip-dev wget git unzip libpq-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev vim \ RUN docker-php-ext-install zip RUN pecl install mongodb RUN docker-php-ext-enable mongodb RUN chown -R www-data:www-data /var/www COPY --from=composer:latest /usr/bin/composer /usr/bin/composer COPY ./docker/php/php.ini /usr/local/etc/php/php.ini docker/nginx/default.conf server { listen 80; root /var/www/html/app/public; index index.html index.php; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { root /var/www/html/app/public; index index.php index.html index.htm; try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } } docker-compose.yml version: "3.2" services: web: image: nginx:latest volumes: - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf - .:/var/www/html/app ports: - "8000:80" depends_on: - app app: build: context: . dockerfile: docker/php/Dockerfile volumes: - .:/var/www/html/app depends_on: - db db: image: mongo:latest volumes: - "./docker/data/mongo:/data/db" - "./docker/data/dump:/root/dump" ports: - "27017:27017" 開発環境を立ち上げる 1. docker-compose build 2. docker-compose up -d 3. docker-compose exec app /bin/bash (ここからappコンテナに入る) 4. compose intall 5. cp .env.example .env
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでcsvファイルのvalidationをする

概要 ・開発でcsvインポート機能を作った際にバリデーションでちょっと手間取った ・力技かもしれないがとりあえず頑張った証拠として残しておこうと思った。 ・ライブラリ等は使ってません。 これが正解かもわからないですがもっといい方法あるよとかあれば教えていただけると嬉しいです。 仕様 PHP 7.4 Laravel 8 mysql 8 DBテーブル詳細 仮にこんなテーブルがあるとします。 prohectsテーブル またこのprojectsテーブルにはpositionsテーブルとskillsテーブルが多対多で紐づいています。 positionsテーブル skillsテーブル これらのテーブルにcsvから一気に登録します。 テーブルの中身よりもcsvのデータに対しても普通にバリデーションできているところがミソです。 csvファイル csvファイルはこんな感じです。色ついてるところは気にしなくて大丈夫です。 リレーションしているところはめんどくさいのでIDで記入しました。skillとpositionは複数登録できるのでexplodeして配列で入れます。 実装 今回はRequestクラスを使ってRequestクラス内で完結するやり方です。 TestRequest.php <?php namespace App\Http\Requests\Test; use App\Models\Agent; use App\Models\Position; use App\Models\Skill; use App\Models\Station; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; use SplFileObject; class TestRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules(): array { $skills = Skill::all(); $skill_ids = $skills->pluck('id')->toArray(); $positions = Position::all(); $position_id = $positions->pluck('id')->toArray(); $agents = Agent::all(); $agent_ids = $agents->pluck('id')->toArray(); $stations = Station::all(); $station_ids = $stations->pluck('id')->toArray(); return [ 'csv_file' => ['required', 'file', 'mimetypes:text/plain', 'mimes:csv,txt'], 'csv_array' => ['required', 'array'], 'csv_array.*.name' => ['required', 'unique:projects', 'string'], 'csv_array.*.station_id' => ['required', 'integer', Rule::in($station_ids)], 'csv_array.*.description' => ['required', 'string', 'max:500'], 'csv_array.*.required_condition' => ['nullable', 'string', 'max:500'], 'csv_array.*.better_condition' => ['nullable', 'string', 'max:500'], 'csv_array.*.work_start' => ['nullable', 'string', 'max:5'], 'csv_array.*.work_end' => ['nullable', 'string', 'max:5'], 'csv_array.*.weekly_attendance' => ['nullable', 'integer', 'max:5'], 'csv_array.*.skill_ids' => ['required', 'array', 'max:10'], 'csv_array.*.skill_ids.*' => ['required', 'integer', Rule::in($skill_ids)], 'csv_array.*.position_ids' => ['required', 'array', 'max:10'], 'csv_array.*.position_ids.*' => ['nullable', 'integer', Rule::in($position_id)], ]; } protected function prepareForValidation() { $file_path = $this->file('csv_file')->path(); // CSV取得 $file = new SplFileObject($file_path); $file->setFlags( SplFileObject::READ_CSV | // CSVとして行を読み込み SplFileObject::READ_AHEAD | // 先読み/巻き戻しで読み込み SplFileObject::SKIP_EMPTY | // 空行を読み飛ばす SplFileObject::DROP_NEW_LINE // 行末の改行を読み飛ばす ); foreach ($file as $index => $line) { // ヘッダーを取得 if (empty($header)) { $header = $line; continue; } $csv_array[$index]['station_id'] = (int)$line[0]; $csv_array[$index]['name'] = $line[1]; $csv_array[$index]['description'] = $line[2] == "" ? null : $line[2]; $csv_array[$index]['required_condition'] = $line[3] == "" ? null : $line[3]; $csv_array[$index]['better_condition'] = $line[4] == "" ? null : $line[4]; $csv_array[$index]['work_start'] = $line[5] == "" ? null : $line[5]; $csv_array[$index]['work_end'] = $line[6] == "" ? null : $line[6]; $csv_array[$index]['weekly_attendance'] = (int)$line[7] === 0 ? null : (int)$line[7]; $csv_array[$index]['skill_ids'] = explode(',', $line[8]); $csv_array[$index]['position_ids'] = explode(',', $line[9]); } $this->merge([ 'csv_array' => $csv_array, //requestに項目追加 ]); } } ざっくり解説すると Requestで入ってきたcsvデータを配列に入れて整理しcsv_arrayという名前で項目を追加してバリデーションしていく感じです。 prepareForValidation関数はLaravelで提供されている関数でバリデーション前にRequestの中身を加工することができます。 csvのデータは配列に加工しているので.*で取り出すことができます。 項目を追加しているので元々のcsvファイル自体のバリデーションも同時に行えます。 intにしたり中身が空だった時にnullにしたりしているところは各仕様に合わせて変更してください。 stringで避ければそのままいれるだけで大丈夫です。 以上です。 参考 【Laravel】バリデーション前にデータ加工する方法
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel csvファイル読み込み&出力

csvファイル storage/app/members.csv 山田太郎,東京都港区,090-0000-0000 佐藤花子,東京都杉並区,090-2222-2222 山本二郎,東京都豊島区,090-3333-3333 田中三郎,神奈川県横浜市,090-4444-4444 斎藤さくら,東京都台東区,090-5555-5555 加藤桃,東京都世田谷区,090-6666-6666 ルーティング /アプリ名/routes/web.php <?php Route::get('/csv_sample', 'SampleController@csvSample'); コントローラー app/Http/Controllers/SampleController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class SampleController extends Controller{ public function csvSample(){ // SplFileObjectの作成 $file = new \SplFileObject(storage_path('app/members.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.csv_sample', [ 'title' => 'CSV読み込みのサンプル', 'members' => $members, ]); } ビュー resources/views/samples/csv_sample.blade.php @extends('layouts.default') @section('title', $title) @section('content') <h1>{{ $title }}</h1> @foreach($members as $member) <p>{{ $member[0] }}: {{ $member[1] }} TEL: {{ $member[2] }}</p> @endforeach @endsection dd は「dump and die(データを吐いて終了)」の省略形。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む