FuelPHPをやってみる (30) - Model_Nestedset -
久々にFuelPHPやってみる。ていうかFuelPHP1.7が出た模様で、OrmパッケージにModel_Nestedsetっていうのがあるらしいので使ってみた
※暫定的なので追記する可能性あり
久々にFuelPHPやってみる。ていうかFuelPHP1.7が出た模様で、OrmパッケージにModel_Nestedsetっていうのがあるらしいので使ってみた
※暫定的なので追記する可能性あり
Laravel4のインストールパッケージ日本語版も更新しました。認証の設定ファイル、パスワードリマインダーに、有効時間(分)が追加されています。バリデーション言語ファイルに個数指定に対するメッセージが追加されました。
— Hirohisa Kawase (@HiroKws) July 31, 2013
前回で認証的な機能を作ったのはいいけど、パスワード等を忘れた場合にメールでパスワード変更URLを通知してアクセスしてもらって新しいパスワードを設定するとかっていう形式を利用する事が出来る模様
http://laravel.com/docs/security のドキュメント読み。なんだがユーザー認証的な所だけを書く。っていう事でフォーム認証な所をやってみる。パスワードリマインダー的な所は次回に書く。まとめて書くとわけわかめになるので
あとめんどくさいのでクラス作らずにroutes.phpにClosureでダラ書き
http://laravel.com/docs/queues のドキュメント読みなんですが、一部IronMQっていうのに依存する機能がある模様げで、そのIronMQを使ってないのでそこは(ry
でMQサーバー何使うのって所として、んまぁ手軽だしBeanstalkで良いんじゃないかって事で。
使い方合ってるのかは定かじゃない。当てずっぽうで書いてる感も否めないのですが。ドキュメント的には http://laravel.com/docs/facades と http://laravel.com/docs/ioc の組み合わせ的な感じかと
http://laravel.com/docs/security のセクションリンクは無いけど「CSRF Protection」セクションに書いてある通り、csrfのフィルターを利用する事でCSRFなプロテクションを利用する事が出来るっぽい。app/filters.phpにはデフォルトでCSRFなフィルターが定義されている。
http://laravel.com/docs/responses 辺りのドキュメント読みつつやってみる的な事を遂行。部分的な事(ResponseとwithCookieとか)は既にやってるので省略。という事で主な所はViewsに関係する所くらいか
何やら前回でEventがあーだらこーだらですっ飛ばすっていうのを書いたんですが、あれEventがどうだとかいう事じゃなくて、単純にMockオブジェクトとしてのテスト手法なセクションだった模様で
久々にLaravelなドキュメント読みを遂行。 http://laravel.com/docs/testing のコントローラーテストな部分だけをやってみた。
コントローラー等によりが渡る前などに前後処理等を行ったり出来る。まぁ良くあるパターンとして、コントローラーに処理が回る前に認証状態をチェックしたりとか
フィルター自体の定義はapp/filters.phpに行う
これも1.6から入った物だと思うのだけど、まぁ名前の通り「SimpleAuthをOrmパッケージでやった物」的なスタンスなのかなと。まぁ「Orm自体だけでもパフォーマンスそんなに良いとは言えないような気がするのに、これ必要なんですか」っていう疑問がまず出たのだけど、まぁやってみましょうか的な感じで
恐らくはormパッケージも使うのでalways_loadにはorm及びauthが必要かと
FuelPHP 1.6 Release(祝)
っていう事で1.6から追加された模様気なOrmModel_Temporalを使ってみる。まずこれなんなのかって、バージョニング出来るモデルみたいな感じなのかなと。で
ぶっちゃけこれ見た方が概要全て解説されているかと思いますんで、是非一読される事をオススメします。っていうか自分もこれ見てやってみただけなので
動かしてるシステムとかのPHPパッケージをPEAR経由でインストール出来るようにしたいとか。pirumっていうのを使えば簡単に構築できるらしいのでやってみた
<?php
abstract class Phest_Assert implements Phest_Assert_Interface {
public static function getTester() {
return Phest_Context::getInstance();
}
public static function getReporter() {
$tester = static::getTester();
if (!($tester instanceof Phest_Context)) {
throw new Phest_Exception("invalid test context");
}
$reporter = $tester->getReporter();
if (!($reporter instanceof Phest_Report)) {
throw new Phest_Exception("invalid report instance");
}
return $reporter;
}
public static function report($testSuccessful, $e = null) {
static::getReporter()->report($testSuccessful, $e);
}
}
みたいなクラスがあったと場合にgetReporterメソッドの内部をMockを使ってテストする場合には
あくまでPHP_CodeCoverageを単体で使うっていう前提でPHPUnit等は使いません。例えば
PHPUnitみたいにテストケースクラスっていう方式じゃなくても、もっとシンプルにテストかけたら良いよね
って思う事もしばしばあるのですが、まぁテストフレームワークを作ったとしても結局カバレッジ出力な機能に関しては捨てられませんよねって話。という事で単体で使う方法を調べてみた
超久々にFuelPHPを触って見てる。タイトル通り、FuelPHPからMongoDBを使うネタ。まぁドキュメントに書いてる通り進めてるだけなので、詳しくはそれ読めと
タイトルじゃ意味がわかりづらいかなと。簡単に言えば「本当にアサーションが発生しているのかをテストする」っていう事
例えばコールバックを引数に持つクラスメソッドを実行する前提のテストを行う際に、その引数に指定されたコールバックが実行されてそこでアサーションを行なってテストする場合、そのコールバックが正常に作動していなければアサーションが発生したとは考えにくいのではと。
でPerlとかの単体テストで使われるTest::Moreとかでは実行プランっていうのが存在しているので、想定されるテスト(アサーション)が保証する回数を前提にする事が出来る訳で。でこれをPHPUnitでやるにはどうすれば良いのかって
色々見た所だとどうもそういうのをサポートされてないような気もする。だけど、PHPUnit_Framework_Assert::getCountで取得する事が可能な模様。でテストする際にあたってはテスト毎(メソッド)にカウンタが初期化される模様(resetCountとかそういうメソッドもある)
PHPUnit+Selenium使う場合にはPHPUnit_Extensions_SeleniumTestCase使えば良い模様(PHPUnit_Extensions_Selenium2TestCaseっつーのもある)
FuelPHPにLogクラスがありますけど、これを使う場合のログ出力をテストケースでテストしたい場合どうするのかって所。とりあえず手法として、
ログが出力される前と後でログをdiffする
ファイルポインタで出力前に末尾にカーソルを移しておいて出力後にログ取得メソッドで更新された分のカーソルを取得する
っていう手法を思いついた。とりあえず前者なパターンをやってみた(どっちがいいかと言われたら後者の方が良いんじゃないかと思う所)
前回でSimpleAuthを使って認証する方法がありましたが、これを独自実装でやりたい場合にAuthパッケージな機能を利用し認証ドライバを開発する事で組み込める模様。なのでちょっとやってみた
※一応、暫定版です。色々追記するかも
SimpleAuthパッケージを使えば簡単に認証機能を組み込む事が出来る模様ですが、まだ未検証なので自前で認証機能を実装してみる
fuel/app/tasksにタスククラスを定義しておけば、oil refineで使用する事が出来る模様
まぁドキュメントに書いてる通り進めてるだけなので
FuelPHPではHMVCリクエスト方式を利用してビューからコントローラーにリクエストを送ってそのレスポンスをビューにレンダリングしたりも出来る模様
fuel/packagesにディレクトリを作って
├── bootstrap.php ├── classes └── tests
んな感じで構成を作って(正確にはbootstrap.phpがあれば構造はどんな感じでも良いかもtestsディレクトリを除いては)、fuel/app/config/config.phpでパッケージ利用設定を行えば、定義されたクラス群等を利用する事出来る模様。という事でやってみる
fuel/app/modulesに
└── sample └── classes └── controller └── sample.php
な感じでアプリケーションモジュールとして定義出来る。ディレクトリ構造はfuel/app内とほぼ同様な構造かと。んで、コントローラーの場合は http://localhost/モジュール名/コントローラー名/アクション名 等でアクセス可能な模様(モジュール名は省略可能な模様)
Controller_Template + Controller_Rest = Controller_Hybridらしい
PHPを色々やってた時にテンプレートエンジンといえばSmartyな感じで良く使ってた記憶があるので、とりあえずじゃあSmarty使いましょうかと思ってやってみた
ViewModelを使えば、本来コントローラーから値をセットしてビューで表示すると言ったような処理をViewModelに任せる事でコンポーネント化?のように出来る模様
着々とドキュメント読みつつ進めてみる。Controller_Templateを使えばビューレイアウトな方式でレスポンスを出せる模様
例えば以下のようなモデルクラスがあった場合
<?php
class Model_Items extends Model_Crud {
protected static $_table_name = "items";
public static function findById($id) {
$entry = null;
try {
$entry = static::find_one_by("id", $id);
} catch (Database_Exception $e) {
Log::warning($e->getMessage());
}
return $entry;
}
}
まぁ単純にID値から取得するだけのメソッドを定義する。で問題は実際にfind_one_byが失敗した場合(例外により)、結果がちゃんと「NULLである」という保証をテストする必要があると思いますけど。でどうやってそれを再現させるかってところなんですが、まぁよくあるパターンとしてモックでfind_one_byを実行させると例外が出るように設定する。まぁそんな感じの事したいっていう事でやってみた
前にも書いたんですが、コントローラーテスト時にset_methodとかしても結局ルーティングに合わない場合等にはHttpNotFoundExceptionがスローされたりして結局レスポンス取れないっていう事があったのですが、んまぁ大体の言語には「このテストでは例外が出る」っていうのを前提にテストを書く(expectedException)というケースがありきたりだとは思いますが
例外うっせぇ、それでもレスポンスをちゃんとチェックしてえんだよクソが
って思う人もいるでしょう。という事でごちゃごちゃでまだ理解出来た訳じゃないのですが、いろいろ調べてみた。という事で例題的なサンプルのコントローラーが
タイトル通り。フォームからの入力を検証してエラーの場合はフォームにリダイレクト後にエラーメッセージを表示する。セッション管理機能を使うのでfuel/app/config/session.phpの設定が必要
Modelなパッケージにクラス作ってメソッド実装してそこからDBパッケージで取得するみたいな方式でやったけど、Model_Crudを継承して使う事で有用なメソッドが色々存在するのでSQL書いたりQuery Builder使わずにさっくりとデータベースを使える模様。ちなみにFuelPHP的にはORMっていうのはパッケージとして存在するので、これをORMというのは異なると思うので
FuelPHPをやってみようかなーって思ったらApache入ってねーしどうっすかなーって考えてたので、とりあえずphp-fpmで動かしちゃうかっていう事でやってみた
(FuelPHP及びFPM関係の設定は省略)