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ファイルのダウンロードができました!

参考

こちらのサイトを参考にさせていただきました、ありがとうございます。