こんにちわ、いよいよ春到来で外に出るのが楽しくてしょうがないHashiです。今回は先日紹介したLaravelでCSVファイルを読み込む方法に関連して、読み込んだデータをバリデーションする方法を備忘録も兼ねて紹介したいと思います。
なお、Laravelとはなんぞやという方は下の記事を参照してください!
環境
今回の環境は下記の通りとなります。
今回の環境
- Laravel 5.5
- MySQL 5.6.37
仕様と要点
まず、今回のサンプルの仕様と要点、簡単な流れを下記に簡単にまとめます。(基本的には先日の記事を踏襲)
- CSVのデータには、行ごとに「名前」と「メールアドレス」が記載されている
- CSVは「Goodby CSV」ライブラリを使用してパース
- パースしたデータをバリデーション
- パースしたデータをDB(samplesテーブルと仮定)に保存
- samplesテーブルには「name」と「email」フィールドが存在する
CSVのインポート(読み込み)
まず、今回は先日の記事の内容、およびソースに追記する形で進めるので、先日の記事(下記記事)を参照してください。
読み込んだデータをバリデーション
では、実際にバリデーションをしていきたいと思います。
下記が完成形のソースになります。
use App\Sample;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\LexerConfig;
use Illuminate\Support\Facades\Validator;
class SampleController extends Controller
{
public function showImportCSV()
{
return view('sample');
}
public function importCSV(Request $request)
{
//postで受け取ったcsvファイルデータ
$file = $request->file('file');
//Goodby CSVのconfig設定
$config = new LexerConfig();
$interpreter = new Interpreter();
$lexer = new Lexer($config);
//CharsetをUTF-8に変換
$config->setToCharset("UTF-8");
$config->setFromCharset("sjis-win");
$rows = array();
$interpreter->addObserver(function(array $row) use (&$rows) {
$rows[] = $row;
});
// CSVデータをパース
$lexer->parse($file, $interpreter);
$data = array();
// CSVのデータを配列化
foreach ($rows as $key => $value) {
$arr = array();
foreach ($value as $k => $v) {
switch ($k) {
case 0:
$arr['name'] = $v;
break;
case 1:
$arr['email'] = $v;
break;
default:
break;
}
}
// バリデーション処理
$validator = Validator::make($arr,[
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255'
]);
if ($validator->fails()) {
$validator->errors()->add('line', $key);
return redirect('/sample')->withErrors($validator)->withInput();
}
$data[] = $arr;
}
// DBに一括保存
Sample::insert($data);
return redirect('/sample')->with('save_message', 'CSVのデータを読み込みました');
}
}
今回は追記した箇所は、9行目のValidatorのインポート部分と、70〜79行目のバリデーション処理の部分になります。
バリデーションの内容としては、今回はCSVのデータに「name」と「email」が記載されているという想定なので、この二つに対してバリデーションを行います。そして、もしバリデーションに引っかかった場合は、該当する行番号をエラーオブジェクトに追加(77行目)して、リダイレクトさせる仕様になります。また、見ての通り、今回は1行ごとにバリデーションをしているので、エラーが見つかった段階でリダイレクトする形になります。
まとめ
ということで、今回はLaravelにおいて読み込んだCSVデータをバリデーションする方法を紹介させていただきました。バリデーションはとても大事な処理なので面倒くさがらずにしっかりやらないとですね。
それでは、今回はここまで!Hashiでした。また!
この記事のまとめ
- CSVのデータを読み込んでバリデーションをする方法