CakePHP2.xでAmazon S3を操作するDatasourceを作りたい。

Datasourceとはなんぞや?

CakePHPはおよそリレーショナルデータベースでデータを扱うように設計されていますが、それ以外にもファイルにデータを持たせたり、NoSQLなどをデータとすることもできます。

それための枠組みがDatasourceです。

CakePHPのDatasourceディレクトリを覗いてみると、MySQL、PostgreSQLなどのリレーショナルデータベース用のクラスが用意されています。ここにクラスを追加すれば、CouchDBやMongoDBなどに接続することもできるわけですね。

ModelのインタフェースはDatasourceが変わっても同じ

DatasourceへのアクセスはModelが責任をもって行うので、Controllerなどから直接Datasourceを操作することはありません。

ControllerはModelを介してDatasourceにアクセスしますが、そのModelのインタフェースはDatasourceが変わっても同じです。つまり、Model::find(), Model::save(), Model::delete()などです。

だから、データベースをMySQLからPostgreSQLに変更したり、もしかしたらNoSQLに変更してもDatasourceがちゃんと互換性を持って記述されていれば、Controller以降は全くそれを意識する必要がありません。

Modelのインタフェースの設計がリレーショナルデータベースに寄っているので、NoSQLなどをDatasourceにする場合はちょっと面倒かもしれません。とはいえ、Modelが使える全ての機能を実装する必要もないので、必要な部分だけ使えるようにするのであれば、それほど大きな手間でもなさそうです。

探り探りAmazon S3を操作する

実は大目標は、「CakePHPからAmazon DynamoDBに接続すること」なのですが、その前に練習としてAmazon S3を操作するDatasourceを作成しました。

https://github.com/mikesmullin/CakePHP-AWS-S3-Plugin
https://github.com/primeminister/CakePHP-Amazon-S3-plugin

先人が既にいるので、それを使っても良いですが、これらはCakePHP2.xの仕様に乗っていないので、新しく作りました。

やりたいこと

今回作るAmazonS3Sourceで、何がやりたいかといえば、Amazon S3のオブジェクトの操作です。

たとえば、画像をアップロードできたり。

$this->Image->save(array(
	'name' => 'test.png',
	'path' => '/tmp/test.png',
));

名前で検索してデータを取得できたり。

$image = $this->Image->findByName('test.png');

削除できたりしてほしいです。

$this->Image->delete('test.png');

続く

CakePHP2.xでAmazon S3を操作するDatasourceを作った。」に続きます。

About katty0324

One comment

Leave a Reply

Scroll To Top