エラーの発生原因と解消方法
レガシーなプロジェクトと戦っている際に遭遇したエラー。
5.1以降だと普通に使えてハマったので誰かの助けになれば…
そのまま利用しようとすると発生するエラー
Laravel5.0でStorage::disk('ftp')->files('/')
等を使用すると以下のエラーが発生する。
exception 'ErrorException' with message 'call_user_func_array() expects parameter 1 to be a valid callback, class 'Illuminate\Filesystem\FilesystemAdapter' does not have a
method 'createFtpDriver'' in /sampleApp/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php:232
エラー原因
Laravel5.0に同梱されているLeague\FlySystem
はFTPに対応しているが、Illumine/Filesystem
がFTPに対応していないのが原因。
※Laravel5.1からは対応している
Laravel5.0 FilesystemManager APIDoc
→createFtpDriver
メソッドが無い
Laravel5.1 FilesystemManager APIDoc
→createFtpDriver
メソッドが有る
解消方法
公式ドキュメントに記述がある、カスタムファイルシステムを作成する
Laravel 5.0 ファイルシステム/クラウドストレージ - カスタムファイルシステム
実装方法
カスタムファイルシステムを定義
<?php
namespace App\CustomFileSystems;
use Storage;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Filesystem;
use League\Flysystem\Adapter\Ftp;
class FtpFileSystem extends ServiceProvider
{
public function boot()
{
Storage::extend('ftp', function ($app, $config) {
return new Filesystem(new Ftp($config));
});
}
public function register() {}
}
ServiceProviderに作成したカスタムファイルシステムを追加
config/app.php
<?php
return [
'providers' => [
'App\CustomFileSystems\FtpFileSystem'
],
];
Filesystem用コンフィグにFTP接続設定を記述
config/filesystems.php
<?php
return [
'default' => env('FILE_DISK', 'local'),
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path() . '/app',
],
'ftp' => [
'driver' => 'ftp',
'host' => 'hoge.jp',
'username' => 'user',
'password' => 'pass',
],
],
];
呼び出して動かす
use Illuminate\Support\Facades\Storage;
Storage::disk('ftp')->files('/');
レガシープロジェクトからは逃げられないんだなあ わにを。