FuelPHPのコントローラには、Controller、Controller_Template、Controller_Rest、Controller_Hybridの4種類があります。
Controllerはベースとなるクラスであとの3つはこれを拡張したクラスになってます。
今回少し試してみたのはController_Hybrid。
このController_Hybridは、Controller_TemplateとController_Restの両方を組み合わせたようなクラスになってます。
なんかすごそうだなと思ってコアのほうのコード(core/controller/hybrid.php)を見てみると、このクラスは Controller_Rest を継承しています。
RestコントローラとTemplateコントローラの処理をわけるのに書いてることは「 is_ajax()」。(他にも少し処理はありますが)
ですのでHybridコントローラを用いてコントローラを構築した場合、単純にURLにアクセスしてjsonとかを吐き出すことはできないみたいです。
それでちょっと試してことを簡単に。
app/classes/controller/hyb.php
<?php class Controller_Hyb extends Controller_Hybrid { public function action_index() { $this->template->title = 'Hybrid_Template'; $this->template->content = View::forge('hyb/index'); } public function get_list() { $data = array( 'method' => 'GET', 'foo' => Input::get('foo') ); } public function post_list() { $data = array( 'method' => 'POST', 'foo' => Input::post('foo') ); } }
view/hyb/index.php
<p>Hybrid</p> <input type="text" name="val" id="form_val" value="bar" /> <button id="btn_g">GET</button> <button id="btn_p">POST</button> <?php echo Asset::js('jquery-1.8.2.min.js'); ?> <script type="text/javascript"> $(document).ready(function() { $('#btn_g').click(function() { $.get('<?php echo Uri::create('hyb/list.php'); ?>', { bar: $('#form_val').val() }, function(str) { alert(str); }); }); $('#btn_p').click(function() { $.post('<?php echo Uri::create('hyb/list.php'); ?>', { bar: $('#form_val').val() }, function(str) { alert(str); }); }); }); </script>
このコードのURLを例えばhttp://localhost/fuelphp/public/index.php/hyb/としてアクセスするとまずは action_index が呼び出され、入力ボックスとボタンが2つ表示されると思います。
ボタンは GET と POST があり、GET ボタンをクリックすると get_listが POSTボタンをクリックすると post_list が呼び出されているのがわかると思います。
ここは問題なく動作すると思いますが、最初に少し書きましたが「is_ajax()」の判断でRESTコントローラを呼び出してるので
http://localhost/fuelphp/public/index.php/hyb/list.json?bar=bar
というURLに直接アクセスしてもエラーになります。
ちなみに。。。
「is_ajax()」でRESTコントローラを呼び出してるのでコントローラ側に「action_create」とかいうメソッドを作ってajaxで呼び出してみました。
が、予想通り何も反応してくれませんでした。
Hybridコントローラを使ってajax以外からもRESTFulな出力ができればいいのにと感じた次第です。
できるのかな?できるのであれば誰か教えてください!!
0 件のコメント:
コメントを投稿