Skip to content
これは pieceofcake2/filebinder のドキュメントです。pieceofcake2/cakephp 用の CakePHP 2.x プラグインです。 このフォークについて

Filebinderドキュメント ​

Filebinder

Filebinderは、CakePHP 2のモデルのレコードにファイルを添付するプラグインです。モデルの$bindFieldsにファイルのフィールドを書いておくと、Filebinder.Bindableビヘイビアがアップロードされたファイルを保存します。

ビヘイビアは、ファイル名やコンテンツタイプ、サイズといったファイルの情報を添付ファイルのテーブルに保存します。ファイル本体の保存先はローカルのディレクトリ、データベース、Amazon S3の3つで、複数を組み合わせることもできます。find()を実行すると、レコードと一緒にファイルの情報が返ります。

コントローラーとビューのためのクラスもあります。Filebinder.Ringコンポーネントは、アップロードされたファイルを保存できる形に整えます。確認画面のあるフォームでは、リクエストをまたいでファイルを保持します。Filebinder.Labelヘルパーは、ファイルを画像、リンク、URLとして出力します。

動作要件 ​

インストール ​

Composerでプラグインをインストールします。

bash
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()を呼んでいる場合、この手順は要りません。

php
CakePlugin::load('Filebinder');

データベース ​

Filebinderはファイルの情報を添付ファイルのテーブルに保存します。次のテーブルを作ってください。

sql
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はファイルのフィールドを「仮想テーブル」のように扱います。

ファイルのフィールドが1つのモデル

ファイルのフィールドが2つのモデル

ファイルのフィールドを持つ2つのモデル

クイックスタート ​

ここで扱うのは、Postモデルにimageフィールドを追加する例です。フォームから2MBまでのJPEGかPNGのファイルをアップロードし、ビューで表示します。

モデル ​

モデルにビヘイビアを追加し、ファイルのフィールドを$bindFieldsに書きます。ファイルのチェックには、ビヘイビアのバリデーションルールを使います。

php
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()を呼びます。

php
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タイプを指定します。

php
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()は、ファイルのフィールドにファイルの情報を入れて返します。

php
$this->set('post', $this->Post->findById(1));

$post['Post']['image']の中身は次の配列です。

php
[
    '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ヘルパーもコントローラーに追加します。ヘルパーにファイルの情報を渡してください。

php
echo $this->Label->image($post['Post']['image']);

ヘルパーはimgタグを出力します。リンクやURL、非公開のファイルについてはLabelヘルパーを参照してください。

由来 ​

このパッケージは、株式会社Fusicが開発したfusic/filebinderをフォークしたものです。フォーク元は2.0ブランチで、Packagistではfusic/filebinderとして公開されていました。モダンなPHPで動くCakePHP 2のために、pieceofcake2がメンテナンスしています。元のプロジェクトからの変更はフォーク以降のコミット履歴で確認できます。

著作権とライセンスについては LICENSE を参照してください。Cake Software Foundation とは関係ありません。