Filebinderドキュメント
Filebinderは、CakePHP 2のモデルのレコードにファイルを添付するプラグインです。モデルの$bindFieldsにファイルのフィールドを書いておくと、Filebinder.Bindableビヘイビアがアップロードされたファイルを保存します。
ビヘイビアは、ファイル名やコンテンツタイプ、サイズといったファイルの情報を添付ファイルのテーブルに保存します。ファイル本体の保存先はローカルのディレクトリ、データベース、Amazon S3の3つで、複数を組み合わせることもできます。find()を実行すると、レコードと一緒にファイルの情報が返ります。
コントローラーとビューのためのクラスもあります。Filebinder.Ringコンポーネントは、アップロードされたファイルを保存できる形に整えます。確認画面のあるフォームでは、リクエストをまたいでファイルを保持します。Filebinder.Labelヘルパーは、ファイルを画像、リンク、URLとして出力します。
- 動作要件
- インストール
- データベース
- クイックスタート
- 設定: ファイルのフィールド、ビヘイビアの設定、アプリケーションの設定
- ストレージ: ローカルのファイル、データベース、ファイルの復元、差し替え、削除
- Amazon S3: S3クライアント、認証情報、公開と非公開のファイル
- バリデーション: 拡張子、コンテンツタイプ、サイズのルール
- Ringコンポーネント: アップロードと確認画面のあるフォーム
- Labelヘルパー: ファイルの画像、リンク、URLと、loaderによるファイルの保護
- fusic/filebinderからの移行
- 由来
動作要件
- PHP 8.1以上
- pieceofcake2/cakephp 2.12以上
- S3に保存する場合は、pieceofcake2/async-awsとasync-aws/simple-s3、またはpieceofcake2/aws。詳しくはAmazon S3を参照してください。
インストール
Composerでプラグインをインストールします。
composer require pieceofcake2/filebinderプラグインのタイプはcakephp-pluginなので、composer/installersがプラグインのディレクトリにインストールします。アプリケーションのcomposer.jsonでinstaller-pathsを設定してください。
| 構成 | installer-paths |
|---|---|
モダン構成のconfig/、src/、templates/、plugins/ | "plugins/{$name}/": ["type:cakephp-plugin"] |
レガシー構成のapp/Config/、app/Plugin/ | "app/Plugin/{$name}/": ["type:cakephp-plugin"] |
config/bootstrap.phpでプラグインを読み込みます。レガシー構成ではapp/Config/bootstrap.phpです。すでにCakePlugin::loadAll()を呼んでいる場合、この手順は要りません。
CakePlugin::load('Filebinder');データベース
Filebinderはファイルの情報を添付ファイルのテーブルに保存します。次のテーブルを作ってください。
CREATE TABLE `attachments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`model` text NOT NULL,
`model_id` int(11) NOT NULL,
`field_name` text NOT NULL,
`file_name` text NOT NULL,
`file_content_type` text NOT NULL,
`file_size` int(11) NOT NULL,
`file_object` longtext,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;PostgreSQLやSQLiteでは、対応する型を使ってください。たとえばfile_objectはtextにします。
file_objectには、ファイルの内容をBase64で保存します。ビヘイビアがこのカラムに書き込むのは、データベースのストレージを使うときだけです。デフォルトではデータベースのストレージを使います。詳しくはストレージを参照してください。
ビヘイビアはAttachmentモデルを通してこのテーブルを読み書きします。このモデルのクラスを作る必要はありません。別のモデルを使うには、ビヘイビアのmodel設定を変えます。設定を参照してください。
モデルのテーブルには、ファイルのフィールドのカラムを追加しなくてかまいません。Filebinderはファイルのフィールドを「仮想テーブル」のように扱います。



クイックスタート
ここで扱うのは、Postモデルにimageフィールドを追加する例です。フォームから2MBまでのJPEGかPNGのファイルをアップロードし、ビューで表示します。
モデル
モデルにビヘイビアを追加し、ファイルのフィールドを$bindFieldsに書きます。ファイルのチェックには、ビヘイビアのバリデーションルールを使います。
class Post extends AppModel
{
public $actsAs = ['Filebinder.Bindable'];
public $bindFields = [
[
'field' => 'image',
'tmpPath' => '/var/www/html/myapp/tmp/cache/',
'filePath' => '/var/www/html/myapp/webroot/files/',
],
];
public $validate = [
'title' => ['notBlank'],
'image' => [
'allowExtension' => [
'rule' => ['checkExtension', ['jpg', 'jpeg', 'png']],
'allowEmpty' => true,
],
'maxFileSize' => [
'rule' => ['checkMaxFileSize', '2MB'],
'allowEmpty' => true,
],
],
];
}tmpPathは、アップロードされたファイルを保存前に置くディレクトリです。filePathは、保存したファイルを置くディレクトリです。フィールドに書けるキーは設定に、ルールはバリデーションにまとめてあります。
コントローラー
コントローラーにRingコンポーネントを追加し、データを保存する前にbindUp()を呼びます。
class PostsController extends AppController
{
public $components = ['Session', 'Filebinder.Ring'];
/**
* Adds a post.
*
* @return \CakeResponse|null
*/
public function add()
{
if ($this->request->is('post')) {
$this->Ring->bindUp();
if ($this->Post->save($this->request->data)) {
return $this->redirect(['action' => 'index']);
}
}
}
}bindUp()は、アップロードされたファイルをフィールドのtmpPathに移動します。そのうえで、リクエストデータにあるアップロードの情報を、ビヘイビアが保存するファイルの情報に置き換えます。詳しくはRingコンポーネントを参照してください。
フォーム
フォームにはfileタイプを指定します。
echo $this->Form->create('Post', ['type' => 'file']);
echo $this->Form->input('title');
echo $this->Form->input('image', ['type' => 'file']);
echo $this->Form->end(__('Submit'));ファイルの情報を読む
find()は、ファイルのフィールドにファイルの情報を入れて返します。
$this->set('post', $this->Post->findById(1));$post['Post']['image']の中身は次の配列です。
[
'id' => 10,
'model' => 'Post',
'model_id' => 1,
'field_name' => 'image',
'file_name' => 'photo.jpg',
'file_content_type' => 'image/jpeg',
'file_size' => 12345,
'created' => '2026-10-22 10:00:00',
'modified' => '2026-10-22 10:00:00',
'file_path' => '/var/www/html/myapp/webroot/files/Post/1/image/photo.jpg',
'bindedModel' => 'Attachment',
]ファイルのないレコードでは、フィールドの値はnullです。
ファイルを表示する
RingコンポーネントはLabelヘルパーもコントローラーに追加します。ヘルパーにファイルの情報を渡してください。
echo $this->Label->image($post['Post']['image']);ヘルパーはimgタグを出力します。リンクやURL、非公開のファイルについてはLabelヘルパーを参照してください。
由来
このパッケージは、株式会社Fusicが開発したfusic/filebinderをフォークしたものです。フォーク元は2.0ブランチで、Packagistではfusic/filebinderとして公開されていました。モダンなPHPで動くCakePHP 2のために、pieceofcake2がメンテナンスしています。元のプロジェクトからの変更はフォーク以降のコミット履歴で確認できます。
