FuelPHPをやってみる (17) - HMVCリクエスト -
FuelPHPではHMVCリクエスト方式を利用してビューからコントローラーにリクエストを送ってそのレスポンスをビューにレンダリングしたりも出来る模様
fuel/app/classes/controller/home.php
<?php
class Controller_Home extends Controller {
public function get_index() {
return View::forge("home");
}
public function get_sample() {
if (Request::is_hmvc()) {
return View::forge("sample");
}
throw new HttpNotFoundException();
}
}
HMVCリクエストかどうかについてはRequest::is_hmvcでチェック出来る。でHMVCリクエストで無い場合には404エラーをスローするようにしている(ブラウザからコントローラーアクションなURLにアクセスすると404になる)
fuel/app/views/home.php
<html>
<body>
<?php echo Request::forge("home/sample")->execute(); ?>
</body>
</html>
でちょっと気になるのが http://press.nekoget.com/fuelphp_doc/general/hmvc.html にある
「デフォルトでは、すべてのリクエストは、Fuel のルーティングエンジンによって処理されます。 もし、ルーティング可能でないリクエストをしたい場合 (たとえば、ブラウザからそれをリクエストされたくない場合)、"false" を 2 番目のパラメータとして forge() の呼び出しに渡す必要があります。 そうしない場合、リクエストを実行すると、404 エラーで終了します!」
っていう所。第2引数にfalseを入れるとルーティングエンジンで解決しないっていうのがどうも動作的にどうなるのかが微妙。ソース見た所だと「Request::forge -> Router::process -> new Route(falseにした場合)」という流れになるような模様だけど、引数にfalseを設定した場合Router::processでルーティング定義から探索をしないっていう所だけはわかるけど、それが「ルーティング可能では無い」という意味合いがかなり微妙
とりあえずまぁ、ビューからコントローラーアクションをコンポーネントな感じで扱う事が出来て、それを検知するのにis_hmvcを使えばチェック出来るよな感じかなと
ちなみにHMVCリクエストなコントローラーアクションのテストケースに関してはまだ調査してないので判明次第追記する予定
追記 HMVCリクエストのテスト
普通にやれば良い模様
<?php
class Test_Controller_Home extends TestCase {
public function test_get_sample() {
$res = Request::forge("home/sample")->execute()->response();
$this->assertEquals(200, $res->status);
}
}
ただ返ってくるFuel\CoreResponseのbodyがFuel\CoreViewになってるので、それの結果をテストする場合は
$res->body->render()
で出力結果とかを取れるのでそれをテストするなり、Fuel\Core\Viewのままテストするなりでも良いのかなと