2013/12/03
FuelPHP Advent Calendar 2013 の 3 日目です。昨日は、@kenji_s さんの「FuelPHPの開発環境を20分で構築する(Vagrant編)」でした。`
今日は、FuelPHP の データベースマイグレーションを Pagoda Box で使う時にハマるポイントについて書きたいと思います。テーマがニッチ過ぎて、同じようなことで困っている人が他にもいるのか少し心配ではありますが、気にせず行きたいと思います。
まず、Pagoda Box ってなんや?というはなしを。
Pagoda Box は、LAMP 環境を構築できる PHP 専門の PaaS です。
PHP が使える PaaS はいくつかありますが、Pagoda Box は PHP に特化した PaaS なので、PHP エンジニアにはとてもなじみやすく、僕は結構気に入ってよく使っています。ちなみに、FuelPHP の公式サイトも Pagoda Box 上で動いているようです。
なお、Pagoda Box については、この間発売されたこの本に書きました。みなさん、よければ読んでみてください。
PHPエンジニア養成読本 〔現場で役立つイマドキ開発ノウハウ満載! 〕 (Software Design plus)
続いて、FuelPHP でのデータベースマイグレーションの手順を簡単におさらいしておきましょう。
公式サイトの説明は、http://fuelphp.com/docs/general/migrations.html ですね。
$ oil generate model xxx
で model クラスと、マイグレーション用のクラスが一気に作られます。僕は好みで、--crud
を使うことが多いです(というかcrud しか使いません)。
% php oil generate model post id:int name:varchar message:text created_at:datetime --crud --mysql-timestamp Creating model: /Users/omoon/Documents/www/speak_on_fuelphp/fuel/app/classes/model/post.php Creating migration: /Users/omoon/Documents/www/speak_on_fuelphp/fuel/app/migrations/001_create_posts.php
で、つくられるmodelクラス。
// fuel/app/classes/model/post.php class Model_Post extends \Model_Crud { protected static $_properties = array( 'id', 'name', 'message', 'created_at' ); protected static $_mysql_timestamp = true; protected static $_table_name = 'posts'; }
つくられるマイグレーションクラス
// fuel/app/migrations/001_create_posts.php namespace Fuel\Migrations; class Create_posts { public function up() { \DBUtil::create_table('posts', array( 'id' => array('constraint' => 11, 'type' => 'int'), 'name' => array('constraint' => 255, 'type' => 'varchar'), 'message' => array('type' => 'text'), 'created_at' => array('type' => 'datetime'), ), array('id')); } public function down() { \DBUtil::drop_table('posts'); } }
で、$ oil r migrate
で該当テーブルがデータベースに作成されます。この際、
migration
というテーブルfuel/app/config/FUEL_ENV/migrations.php
というファイル(FUEL_ENV
は環境)が作成され、マイグレーションの状況を管理するしくみになっています。
このしくみを使って、Pagoda Box へアプリケーションをデプロイしたタイミングでデータベースの初期化まで一気にやってしまいたいのですが、以下の問題がありうまくいかないということがわかりました。
$ oil r migration
実行時に fuel/config/production/migrations.php
ファイルが生成されるので、fuel/config/production/
を writable にする必要があるfuel/config/production/db.php
が消えるfuel/app/config/pagoda/db.php
に別ファイルで Pagoda Box 甩設定ファイルを用意しておくfuel/app/config/pagoda/db.php
ファイルをfuel/app/config/production/
配下へコピーするという作戦で解決です。
参考までに Boxfile 例。
global: env: - FUEL_ENV: production db1: type: mysql name: speak web1: shared_writable_dirs: - /fuel/app/cache - /fuel/app/logs - /fuel/app/tmp - /fuel/app/config/production # <- migrations.php が作られるためwritableに document_root: public php_version: 5.4.14 php_date_timezone: "Asia/Tokyo" php_extensions: - pdo_mysql - zip after_build: - "curl -s http://getcomposer.org/installer | php" - "php composer.phar install" before_deploy: # production とは別のディレクトリにおいておいた db.php をコピー - "cp fuel/app/config/pagoda/db.php fuel/app/config/production/db.php" - "php oil r migrate"
fuel/app/config/pagoda.db.php はこうなります。
return array( 'default' => array( 'connection' => array( 'dsn' => 'mysql:host='.$_SERVER['DB1_HOST'].';port='.$_SERVER['DB1_PORT'].';dbname='.$_SERVER['DB1_NAME'], 'username' => $_SERVER['DB1_USER'], 'password' => $_SERVER['DB1_PASS'], ), ), );
これで、$ git push pagoda
で一気にアプリケーションのデプロイからデータベースの初期化までできるようになります。
それでは、また。
明日は、mikakane さんです。