Laravel 5.3でcsvのダウンロード機能を実装しましたのでまとめます。
と言いましても、ほとんどこちらの情報でできました。 ソースファイルの置き場所を変えて、ちょいちょい環境に合わせて修正したくらいです。 LaravelでCSVダウンロード。
サービスプロバイダ、ファサードの作成と登録を行い、 コントローラーで呼び出す形で実装してます。
ので、ファサードやサービスプロバイダの登録手順の参考にもなるかと思います。
手順
CSV管理クラスの作成
$ vi app\Repositories\Csv.php
<?php
namespace App\Repositories;
use Response;
use Config;
use Illuminate\Support\Facades\Log;
class CSV {
public function __construct() {
}
/**
* CSVダウンロード
* @param array $list
* @param array $header
* @param string $filename
* @return \Illuminate\Http\Response
*/
public function download($list, $header, $filename) {
if (count($header) > 0) {
array_unshift($list, $header);
}
$stream = fopen('php://temp', 'r+b');
foreach ($list as $row) {
fputcsv($stream, $row);
}
rewind($stream);
$csv = str_replace(PHP_EOL, "\r\n", stream_get_contents($stream));
$csv = mb_convert_encoding($csv, 'SJIS-win', 'UTF-8');
$headers = array(
'Content-Type' => 'text/csv',
'Content-Disposition' => "attachment; filename=$filename",
);
return \Response::make($csv, 200, $headers);
}
}
サービスプロバイダーの追加
$ php artisan make:provider CSVServiceProvider
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Repositories\CSV;
class CSVServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->bind(
"csv",
"App\Repositories\CSV"
);
}
}
ファサードの追加
$ mkdir app/Facades
$ vi app/Facades/CSV.php
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class CSV extends Facade {
public static function getFacadeAccessor() {
return 'csv';
}
}
dump-autoloadを実行
名前空間を新たに記述した時は実行しなきゃいけないみたい。
$ composer dump-autoload
設定ファイルに作成したものを追加
$ vi config/app.php
'providers' => [
~~ 省略 ~~
App\Providers\CSVServiceProvider::class
~~ 省略 ~~
],
'aliases' => [
~~ 省略 ~~
'CSV' => App\Facades\CSV::class,
~~ 省略 ~~
]
Routerにパスを追加
Route::get('/csv_export', 'Controller@csv_export');
Controllerにダウンロード機能の記載
use CSV;
~省略~
/**
* csvエクスポートを行う。
* @param Requrest $request - リクエスト
*/
public function csv_export(Request $request) {
// ヘッダー情報を設定
$csvHeader = ['名前', '誕生日'];
// csvの内容を設定
$list = [];
return CSV::download($list, $csvHeader, 'list.csv');
}
設定の更新を反映(キャッシュを使っている場合のみ)
$ APP_ENV=local php artisan config:cache
csvファイルのダウンロードができました!
参考
こちらのサイトを参考にさせていただきました、ありがとうございます。