FuelPHP
データベースを使う その4 CRUDモデル生成
oilコマンドでCRUDモデル(Create、Retrieve、Update、Deleteの機能を持ったModel_Crudクラス)のコードを自動生成してみます。
CRUDモデルはORMモデルほど強力ではありませんが、機能が絞られているぶん、簡単なアプリケーション手軽に作るのに向いています。
oilコマンドに--crud
オプションを付ける以外は、ORMモデルと同じ方法で生成できます。ORMモデル生成の記事も参照してください。
ここでは、varchar[32]のnameカラムを持つuserテーブルを生成します(テーブルの命名には少し注意が必要です)。
$ oil g model user name:varchar[32] --crud
上記のコマンドを実行すると、fuel/app/classes/model/user.phpファイルが生成されます。
oilコマンドは$ oil create
で作成したディレクトリで実行することに注意してください。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php class Model_User extends Model_Crud { protected static $_properties = array( 'id', 'name' ); protected static $_table_name = 'users'; } |
idはoilによって自動的に付加されます。
fuel/migrationsディレクトリにはusersテーブルをcreateする001_create_users.phpが生成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php namespace FuelMigrations; class Create_users { public function up() { DBUtil::create_table('users', array( 'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true), 'name' => array('constraint' => 32, 'type' => 'varchar'), ), array('id')); } public function down() { DBUtil::drop_table('users'); } } |
ORMモデルと違って、CRUDモデルはオブザーバー機能を持たないため、テーブルにはcreate_atとupdate_atが付加されません。
モデルとマイグレーションを生成したら、データベースに反映させましょう。
$ oil r migrate
を実行すると、データベースにテーブルが作成されます。
データベースを使う その3 ORMモデル生成
oilコマンドでORM(Object Relation Mapper)モデルのコードを自動生成してみます。
ORMはCRUD(Create、Retrieve、Update、DeleteといったSQL処理)だけでなく、データベーステーブルをオブジェクトにマップして、テーブル間のリレーションまでも面倒を見てくれる非常に強力なシステムです。
ここでは、varchar[32]のnameカラムを持つuserテーブルを生成します(テーブルの命名には少し注意が必要です)。
$ oil g model user name:varchar[32]
上記のコマンドを実行すると、fuel/app/classes/model/user.phpファイルが生成されます。
oilコマンドは$ oil create
で作成したディレクトリで実行することに注意してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php class Model_User extends OrmModel { protected static $_properties = array( 'id', 'name' ); protected static $_observers = array( 'OrmObserver_CreatedAt' => array( 'events' => array('before_insert'), 'mysql_timestamp' => false, ), 'OrmObserver_UpdatedAt' => array( 'events' => array('before_save'), 'mysql_timestamp' => false, ), ); } |
idはoilによって自動的に付加されます。
fuel/migrationsディレクトリにはusersテーブルをcreateする001_create_users.phpが生成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php namespace FuelMigrations; class Create_users { public function up() { DBUtil::create_table('users', array( 'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true), 'name' => array('constraint' => 32, 'type' => 'varchar'), 'created_at' => array('constraint' => 11, 'type' => 'int'), 'updated_at' => array('constraint' => 11, 'type' => 'int'), ), array('id')); } public function down() { DBUtil::drop_table('users'); } } |
モデルとマイグレーションを生成したら、データベースに反映させましょう。
$ oil r migrate
を実行すると、データベースにテーブルが作成されます。
テーブルにはcreate_atとupdate_atの2つのフィールドが自動で付加されます。
oilコマンドのオプションでこれらのタイムスタンプを省略したりフィールド名を変更することができます。
FuelPHP tips データベースのcreated_at、updated_atが不要、または変更したい
マイグレーションで生成されるデータベースにはcreated_atフィールドとupdated_atフィールドが付加されます。これらが不要な場合は、–no-timestampオプションを設定します。
$ oil g model テーブル名 [フィールド1 [フィールド2] ...] --no-timestamp
–no-timestampオプションが設定されると、モデルのコードに$_observersが生成されません。
また、created_atやupdated_atのフィールド名を変更したい場合は、オプションで--created-at=フィールド名
、--updated-at=フィールド名
を設定します。
FuelPHP tips マイグレーションしたテーブル名がなんか変
マイグレーションで作成されたテーブル名は自動的に’s’や’es’が付加されて複数形になります。このため、生成されたテーブルが意図しないテーブル名になってしまうことがあります。
また、mysqlではテーブル名に’_’を使用できますが、FuelPHPは’_’をディレクトリ区切りと解釈するので、<code>$ oil r migrate</code>が失敗します(PDOドライバではダメでした。mysqliドライバでは大丈夫なようです)。
そのうえ、テーブル名を’user_account’などとした場合、fuel/app/classes/model/userディレクトリにaccount.phpが生成され、クラス名がModel_Accountとなってしまいます。
テーブル名の命名には、末尾が’s’で終わらないようにする、’_’を使わない、などの注意が必要です。
チュートリアル css と javascript のリンク方法
おはようございます。ゆうきんだぜぇ。ワイルド(ry
前回までで、大分FuelPHPの使い方に慣れたかと思います。
今回は近代のWebページでは必ずと言っていいほど用いられる css と javasript のリンク方法を説明します。
といっても簡単なので、すぐ終わります。
リンク方法
css は Asset::css(‘リンクしたいcss名’); を呼び出す。
javascript は Asset::js(‘リンクしたいjavascript名’); を呼び出す。
これだけです。
css は public/assets/css に、javascript は public/assets/js に配置します。
呼び出すファイルはビューになります。
必要ないとは思いますがサンプルをどうぞ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <?php echo Asset::css('sample.css'); ?> <?php echo Asset::js('sample.js'); ?> <title>リンク</title> </head> <body> <p>リンクって聞くとゼ○ダの伝説しか出てこない</p> </body> </html> |
sample.css と sample.js をリンクしてます。
そっちは css と javascript の記述に従って適当に用意してください。
ここに書くべきではないかも知れませんが、Asset::css などはFuelPHPの関数です。
phpで使えるならFuelPHPで用意されている関数だろうが、独自に作った関数だろうがビューで呼び出せるので、覚えておくとプログラミングの幅が広がるかもしれません。
では、おやすみなさい。
インストール (ダウンロード版)
こちらにて、oilコマンドによるFuelPHPのインストールができたと思います。
このページでは「oil create ~~~~」を使わないインストール方法を書きます。すぐ終わります。
あ、バージョンは1.4で。
1. まず、ファイルをダウンロードします。→http://fuelphp.com/
「download v○.○ now!」ってボタンでダウンロードです。
2. ダウンロードしたファイルを展開しましょう。
ユーザーは「test_user」だとして、「/home/test_user」にファイルを展開しましょう。
展開したディレクトリ名を「sample」とします。(お好みでどうぞ)
最終的なパスは「/home/test_user/sample」となるはず。
3. oil refine install ・・・
ここでパーミッション設定やら色々やってくれるoilコマンドがあるので使います。
1 2 |
$cd /home/test_user/sample $php oil refine install |
これで終了。
成功すると緑文字で以下のメッセージが表示されます。
1 2 3 4 |
Made writable: /home/test_user/sample/fuel/app/cache Made writable: /home/test_user/sample/fuel/app/logs Made writable: /home/test_user/sample/fuel/app/tmp Made writable: /home/test_user/sample/fuel/app/config |
ね、すぐ終わったでしょ。
チュートリアル モジュールとは
次 チュートリアル css と javascript のリンク方法
おはようございます。さっそくネタが尽きたゆうきんです。
今回はモジュールについて説明します。
モジュールとは、「いくつかの部品的機能を集め、まとまりのある機能を持った部品のこと」だってwikipediaさんが言ってました。
FuelPHPでもこのモジュールを作る機能が用意されています。
FuelPHPでいうところのモジュールとは、MVCそれぞれのファイルをひとまとめにしたものです。
これでファイル数が増えて非常に見づらくなる問題も解決することができます。
モジュールの作成方法
まずは、 fuel/app/modules/ に任意の名前でフォルダを作ります。
今回は rasta という名前にします。
そして、 rasta の中に classes, config, lang, views とういフォルダを作り、さらに classes の中に controller, model, view というフォルダを作ります。
・・・・・・・・・図で表します。
1 2 3 4 5 6 7 8 9 10 11 |
fuel └app └modules └rasta ├classes │├controller │├model │└view ├config ├lang └views |
最終的に、こんな階層になります。
もうお分かりでしょうが、この新しいフォルダの中にコントローラとモデルとビューを追加していくのです。
モジュールを使った時のURL
通常 コントローラ名/メソッド名 がURLになってましたが、モジュール内に作ったコントローラにアクセスしたい場合は、 モジュール名/コントローラ名/メソッド名となります。
私の環境で rasta というモジュールの、 sample というコントローラの test というメソッドにアクセスしたい場合、 http://localhost/fuelphp/rasta/sample/test という感じになります。
モジュール内のconfigファイル
モジュールを作ったとき、 config フォルダを作りました。
この中に config.php や routes.php を配置した場合、 fuel/app/config/ 内の設定項目とかぶりがあった場合、モジュール内の設定が優先されます。
つまり、モジュール内のファイルで404エラーが発生した時に、飛ばすページを通常と切り替えることが可能になったりします。
以上で、モジュールの説明は終わりです。
では、おやすみなさい。
チュートリアル ルーティング
前 チュートリアル RestコントローラとHybridコントローラ
おはようございます。ゆう☆きんです。
今回はルーティングについて説明したいと思います。
FuelPHPでは fuel/app/config/routes.php を編集することでルーティング設定が行えます。
では、どのように編集すればいいのか見て行きましょう。
※ルーティングについての説明はURLを多用し、非常にめんどいので http://localhost/fuelphp ではなく http://example/ とします。
基本的なルーティング
1 2 3 4 5 |
<?php return array( 'login' => 'user/login', ) |
この場合、 http://example/user/login ではなく http://example/login でアクセスできるようになります。
予約済みのルート
fuel/app/config/routes.php を見て下さい。
_root_ と _404_ が設定されていますが、これはFuelPHPであらかじめ定義されている特殊なルートです。
_root_ は http://example/ にアクセスしたときにルートです。
つまりサイトのトップページです。
_404_ は コントローラやメソッドがなかったときのルートです。つまり 404 Not Found 用のルートです。
正規表現によるルーティング
ルーティング設定では正規表現も使えます。正規表現の説明は省きます。
また正規表現以外にも、以下のようなものが使えます。
文字列 | 意味 | 実際の正規表現 |
---|---|---|
:any | URIの任意の部分にマッチ | .+ |
:segment | URIの1つのセグメントにマッチ | [^/]* |
:num | 数字にマッチ | [[:digit:]]+ |
:alpha | 文字にマッチ | [[:alpha:]]+ |
:alnum | 文字と数字にマッチ | [[:alnum:]]+ |
これだけ書くとちょっと意味わかんないんでサンプル。
1 2 3 4 5 6 7 8 9 10 |
<?php return array( '_root_' => 'welcome/index', // The default route '_404_' => 'welcome/404', // The main 404 route 'yugi/(:any)' => 'sample/shodai/$1', // (1) '(:segment)/judai' => 'sample/gx/$1', // (2) '{:num}/yusei' => 'sample/5ds/$1', // (3) ); |
この場合、 http://example/yugi/hitode で(1)にルーティングされます。
ルーティング処理は上から順に実行されます。
なので、 http://example/yugi/judai でも(2)ではなく(1)にルーティングされるので注意です。
http://example/haou/judai の場合は(2)に、 http;//example/123/yusei の場合は(3)にそれぞれルーティングされます。
ここからは高度なルーティングについて説明します。
名前付きパラメータ
名前付きパラメータとは、URIのセグメントに名前を付けるものです。
パラメータは : (コロン)を付けることで表せます。また、パラメータ名に数字を使うことができません。
というわけでサンプル。
1 2 3 4 5 6 7 8 9 10 |
<?php return array( '_root_' => 'welcome/index', // The default route '_404_' => 'welcome/404', // The main 404 route 'cal/:year/:month/:day' => 'sample/cal', // (1) 'cal/:year/:month' => 'sample/cal', // (2) 'cal/:year' => 'sample/cal', // (3) ); |
例えば、 http://example/cal/1988/12/26 で(1)にルーティングされます。
この際、コントローラでは $this->param(‘year’); $this->param(‘month’); $this->param(‘day’); を使って各パラメータの数値を取得できます。
http://example/cal/2013 の場合は(4)になり、 $this->param(‘year’); のみ使用可能になるという感じです。
ここで注意ですが、セグメントの多い順から設定しないと http://example/2013/01/18 で cal/year にマッチしてしまう場合があるので、注意してください。
あ、ちなみに最初の日付は私の誕生日です。祝ってくれてもいいんですよ?
HTTPメソッドの使用
サンプル。
1 2 3 4 5 6 7 8 9 10 11 |
<?php return array( '_root_' => 'welcome/index', // The default route '_404_' => 'welcome/404', // The main 404 route 'sample/(:any)' => array( array('GET', new Route('data/get/$1')), array('POST', new Route('data/post/$1')) ), ); |
http://example/sample/abc にGETでアクセスすれば http://example/data/get/abc にルーティングされ、
http://example/sample/abc にPOSTでアクセスすれば http://example/data/post/abc にルーティングされます。
つまりそういうことです。
名前付きルート
サンプル。
1 2 3 4 5 6 7 8 |
<?php return array( '_root_' => 'welcome/index', // The default route '_404_' => 'welcome/404', // The main 404 route 'rasta/yukin' => array('yukin/index', 'name' => 'yukin'), // (1) ); |
この場合、 http://example/yukin/index にアクセスすると http://example/yukin/index にルートされます。
そして、そのルートに対して yukin という名前を付けていることになります。
これで何が出来るかというと、 Router::get(‘ルート名’); でURLを生成できるようになるので、下記のようなことが可能です。
1 2 3 4 5 6 7 8 9 10 11 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>リンクの生成</title> </head> <body> <?php echo Html::anchor(Router::get('yukin'), 'ゆうきんのページ'); ?> </body> </html> |
Html::anchor とはリンクを生成するメソッドです。
第1引数でURLを指定し、第2引数でリンク名を指定します。
この場合、 Router::get(‘yukin’) で生成したURLを渡してるわけです。
このようにすることが可能ですので、例えば rasta/yukin から rasta/member/yukin にしたいなぁとなったとき、
ルーティング設定だけ更新すればいいので、ビューを弄る必要がありません。
同じURLを複数のビューでリンクするとき、複数のビューを直す手間が省けます。
名前付きルートを使用するときの注意ですが、正規表現や名前付きパラメータが使用出来ません。※現在 FuelPHP 1.2
以上でルーティング設定の説明を終わります。
コントローラ名/メソッド名で生成されるURLだけでは限界があるので、是非活用して下さい。
では、おやすみなさい。
oil エラー”This is not a valid Fuel installation so Oil is a bit lost.”
$ curl get.fuelphp.com/oil | sh
でFuelPHPを自動インストールして、その後oilコマンドを実行しようとすると、
This is not a valid Fuel installation so Oil is a bit lost.
とエラーを吐いて実行できないことがあります。
/usr/bin/oilをcatしてみると、./oilが存在するとき$ php oil
を実行し、./oilが無く且つcreate以外なら常に上記のエラーを表示して終了するようになっています。
つまり、/usr/bin/oilは、
$ php oil
とやらずに$ oil
で実行できるようにするラッパ- これ自体はcreateしかできない
よく考えれば判ることなんですが、自動インストールとは$ oil create
を実行することであり、/usr/bin/oilはインストーラのインストーラみたいな物なんですね。
ということで、まずはとにかく$ oil create dir
を実行して、その後oilコマンドを実行するときはcreateしたディレクトリで行いましょう。
データベースを使う その1 設定
FuelPHPのデータベースのマイグレーションやORM(オブジェクト連携モデル)機能を使うには、データベース設定ファイルの編集が必要です。
設定ファイルは、共通の設定を実行環境ごとの設定で部分的に上書きする形式になっています。
ここでは、PDOドライバを使う設定の例を示します。
共通の設定はfuel/app/config/db.phpに記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
return array( 'default' => array( # PDOを使う 'type' => 'pdo', # 接続設定 詳細は実行環境毎のファイルに書きます 'connection' => array( # 接続を持続しない 'persistent' => false, ), # デリミタのクォート記号 'identifier' => '`', # テーブル名のプレフィクスは無し 'table_prefix' => '', # 文字コードはUTF8 'charset' => 'utf8', # キャッシュを使う 'enable_cache' => true, # プロファイルしない 'profiling' => false, ), ); |
接続の詳細を実行環境ごとのファイルに記述することで、コードを書き換えることなく開発用と公開用のデータベースサーバを切り替えて使用することができます。 開発用の設定ファイルはfuel/app/config/development/db.php、公開用の設定ファイルはfuel/app/config/production/db.phpです。
1 2 3 4 5 6 7 8 9 10 11 |
return array( 'default' => array( 'connection' => array( # localhost上のmysqlに作成したfuel_dbデータベースを使う場合 # より安全にするため、dsnにもcharsetを設定する 'dsn' => 'mysql:host=localhost;port=3306;dbname=fuel_db;charset=utf8', 'username' => 'ユーザ名', 'password' => 'パスワード', ), ), ); |
開発用と公開用のほか、テスト用、ステージング用の環境を使うことができます。
設定ファイルはそれぞれfuel/app/config/test/db.php、fuel/app/config/staging/db.phpです。
データベースのモデルではORMパッケージを使うので、fuel/app/config/config.phpのalways_loadにORMの読み込みを追加します。
1 2 3 4 5 6 |
'always_load' => array( 'packages' => array( 'orm', 'parser' ) ), |
追補 mysqliドライバを使う例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
return array( 'default' => array( # mysqliを使います 'type' => 'mysqli', # 接続設定 詳細は実行環境毎のファイルに書きます 'connection' => array( # 接続を持続しない 'persistent' => false, ), # デリミタのクォート記号 'identifier' => '`', # テーブル名のプレフィクスは無し 'table_prefix' => '', # 文字コードはUTF8 'charset' => 'utf8', # キャッシュを使う 'enable_cache' => true, # プロファイルしない 'profiling' => false, ), ); |
1 2 3 4 5 6 7 8 9 10 11 12 |
return array( 'default' => array( # localhost上のmysqlに作成したデータベースfuel_dbを使う場合 'connection' => array( 'hostname' => 'localhost', 'port' => '3306', 'database' => 'fuel_db', 'username' => 'ユーザ名', 'password' => 'パスワード', ), ), ); |