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 件のコメント:
コメントを投稿