2012年10月29日月曜日

Contoller_Hybridも少し試してました #fuelphp

これもメモ程度に。
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 件のコメント:

コメントを投稿