CakePHP3でUpload Plugin3を使いたい!
CakePHPで楽しようシリーズ。今回はファイルアップロードです。
アカウントに紐づくアバター画像をアップするような、任意のフィールドにファイルパスを保存しつつ実際のファイルも保存 というとき。
使うのはこちらのプラグインにしてみました。
レコードが削除されたら紐づいてるファイルも削除したりとか、画像ならアップロードと同時にサムネイルを作ったりなんてこともできるらしい。(ただし別途必要なものあり)
その使い方の備忘録。
環境
今回試している環境です。
CakePHP 3.4
cakephp-upload 3.0
インストール
composerで入れます。srcとかのディレクトリがある場所で、次のように実行。
composer require josegonzalez/cakephp-upload
オートロード
config/bootstrap.phpで、次のように記述して読み込みます。
Plugin::load('Josegonzalez/Upload');
やること
1:DBのテーブルに、保存用のフィールドを用意する
2:ファイルのアップロード先を用意する
3:Tableクラスで、どのフィールドにファイルの情報を保存するか記述する
4:登録に用いるテンプレートで、ファイルをアップロードできるフォームにする
1:DBのテーブルに保存用のフィールドを用意
以下の値を保存することができる。
・ファイル名(必須)
・保存ディレクトリのパス
・ファイルサイズ
・ファイルのタイプ
このうちファイルサイズは数値だけど、それ以外は文字列で。
これらを、任意のテーブルに用意しておく。名前はなんでもOK。
2:ファイルのアップロード先を用意
デフォルトでは / webroot / files / { テーブル名 } / { フィールド名 }に保存されるので、この場所に書き込みができるようなパーミッション設定をしておきます。
他の場所にしたい時は、任意のディレクトリを用意しとく。
3:どのフィールドにファイルの情報を保存するか記述
CakePHP3だとTableクラスのinitialize()の中に、設定を記述します。(Usersという名前のテーブルに紐づいてるのであれば/ Model / Table / UsersTable.php)
もしファイル名を保存するフィールドがphotoとcsvという2つあった場合、最低限の記述はこうなるみたい。
$this->addBehavior('Josegonzalez/Upload.Upload', [
'photo' => [ ],'csv' => [ ]
]);
ファイル名を変更したいとか保存場所を指定したいとか、そういったこのプラグインの設定はここに書きます。フィールドごとの設定を、それぞれの [ ] の中に書いていきます。
どんな設定が可能か、書き方は公式を参照のことということで。
設定できる項目
Behavior configuration options — CakePHP Upload
書き方
4:ファイルをアップロードできるフォームにする
入力フォームのあるテンプレート(add.ctpとかedit.ctpのようなの)で、ファイルのアップロードができるようにする。これはこのプラグインだけの特別な設定が必要なわけではなく、ファイルをアップロードできるようにしておけばOK。
ここでやっておくのは2点。
・formタグでenctype="multipart/form-data"を指定。
・inputタグで type="file"を指定。
FormHelperを使うなら、こんな感じ。
<?= $this->Form->create($file, ['type' => 'file']) ?>
<?= $this->Form->input('photo', ['type' => 'file']) ?>
ここまでで、ひとまず使えるようになりました。
設定がらみで注意が必要そうなのは、レコード削除と同時にアップロードしたファイルを削除する「keepFilesOnDelete」でした。
'keepFilesOnDelete' => false
を書くことでファイルを削除することができるのですが、諸々デフォルトのままだと同じ名前のファイルが複数のレコードに紐づいていたとしても、どれか1つのレコードを削除する時にファイルが消されてしまいます。対応方法としては、こういうのがありそうです。
・保存場所をレコードごとに分ける
'path'のところに{time}を挟んでみたりとか。
・保存時にファイル名を一意になるように変更する
'nameCallback'のところで名前を変えてみるとか。
他の色々
さらにやることというと、サムネイル作ったりバリデーションしたりでしょうか。
サムネイルをつくる
3の設定のところで、'transformer'を設定します。
公式で書かれてるそのままをやってみました。
この例では「Imagine」というのを使っていたので、このプラグインをComposerで入れてBootstrap.phpでオートロードしました。
上記例だとサムネイルのファイル名は「thumbnail-」というのを頭につけてます。なので、レコード削除と同時にファイルも削除する場合、例にあるように'deleteCallback'で「thumbnail-」の方もreturnしてあげる必要があるようです。
バリデーションをする
バリデーションを記述の仕方自体はCakePHP3のルールに従いますが、チェックする方法にこのプラグインが提供する機能を利用することができるようです。
use Cake\Validation\Validator;
を書いてバリデーションの仕組みが使えるようにしたTableクラスで、例えばこんな感じに書くっぽげ。photoというフィールドにファイルサイズの上限を設定したい時。
public function validationDefault(Validator $validator)
{
$validator->provider('upload', \Josegonzalez\Upload\Validation\DefaultValidation::class);
$validator->add('photo', 'fileBelowMaxSize', [
'rule' => ['isBelowMaxSize', 1280],
'message' => 'ファイルサイズが大きすぎます。',
'provider' => 'upload'
]);return $validator;
}
ここでの$validator->provider()で書いてるのが、このプラグインの提供してるやつ。他のは公式を見るとして、主に画像関連のができるようになってます。