プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
FuelPHP1.6、レストコントローラ(Controller_Rest)で拡張子を省略した際の挙動を理解する
レストコントローラ(Controller_Rest)は拡張子の指定で出力形式が変更出来るコントローラです。
細かいことは「FuelPHP1.6、レストコントローラ(Controller_Rest)について理解する」をご覧ください。

さてこのレストコントローラ、拡張子を省略した場合はどうなるんじゃい(--?

ってのが今回のテーマです。

自クラス内で「protected $format」を使って指定した場合は良いのですけどね。

こんな指定をしておくとφ(--)

■app/classes/controller/hoger.php
<?php
class Controller_Hoger extends Controller_Rest
{
    protected $format = "csv";

    public function get_hoge()
    {
        $this->response(
            array(
                'aaa' => array(
                    1, 2, 3
                ),
                'bbb' => array(
                    "A", "B", "C"
                )
            )
        );
    }
}

どんな拡張子を指定してもcsv形式で出力されますから。

そうではない場合、こんなコードに対してφ(--)

■app/classes/controller/hoger.php
<?php
class Controller_Hoger extends Controller_Rest
{
    public function get_hoge()
    {
        $this->response(
            array(
                'aaa' => array(
                    1, 2, 3
                ),
                'bbb' => array(
                    "A", "B", "C"
                )
            )
        );
    }
}

こんなURLでアクセスした場合φ(--)

http://localhost/fuelphp-1.6/public/hoger/hoge

どんな結果になるのかね?と。

いえね。

実は答えは知っていたのですよ。

fuel/core/config/rest.php



'default_format' => 'xml',

で指定されている形式になるって。

ですから拡張子省略時はXML形式で出力される!

と予想したのですが、XML形式で出力されなかったのです。
「csv」に変えても「json」に変えても出力結果は変わらず。
ぶっちゃけここの指定が反映されていない様に見えたのです(--;
どんな指定しても

array(2) {
  ["aaa"]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
  }
  ["bbb"]=>
  array(3) {
    [0]=>
    string(1) "A"
    [1]=>
    string(1) "B"
    [2]=>
    string(1) "C"
  }
}


ってなっちゃうですょ。

それがなんでなの?ってのが今回のお悩みどころでした。

結局分かったのが

rest.phpのignore_http_acceptがfalseの場合、HTTPヘッダ情報のHTTP_ACCEPTに含まれるmimeタイプがRest_Controllerの$_supported_formatsの中に存在するとdefault_formatより優先される

ということ。

ちなみにこちらのサイトを参考にさせていただきましたφ(--)

■memocon様「FuelPHP:Rest_Controllerの拡張子を省略した時のフォーマットを変更する」
http://www.crossl.net/blog/set_rest_controler_def_value/

ありがとうございますm(__)m

rest.phpのignore_http_acceptをtrueにしたら無事解決しました。

■fuel/core/config/rest.php
'ignore_http_accept' => true,

ってな感じです。

「えー、rest.php変更したくなーい(-ε-)」って捻くれ者な方は

■app/classes/controller/hoger.php
<?php
class Controller_Hoger extends Controller_Rest
{
        protected $_supported_formats = array(
            'xml'        => 'application/xml',
            'rawxml'     => 'application/xml',
            'json'       => 'application/json' ,
            'jsonp'      => 'text/javascript' ,
            'serialized' => 'application/vnd.php.serialized',
            'php'        => 'text/plain',
//            'html'       => 'text/html',
            'csv'        => 'application/csv',
       );

    public function get_hoge()
    {
        $this->response(
            array(
                'aaa' => array(
                    1, 2, 3
                ),
                'bbb' => array(
                    "A", "B", "C"
                )
            )
        );
    }
}

のように「$_supported_formats」からhtmlを除外しちゃっても、
まぁ……良いんじゃないですかね……。
ちなみに「$_supported_formats」で指定しているのは
Controller_Restで変換対象とする書式です。

例えばjson形式では出力させたくない!といった場合は

        protected $_supported_formats = array(
            'xml'        => 'application/xml',
            'rawxml'     => 'application/xml',
//            'json'       => 'application/json' ,
//            'jsonp'      => 'text/javascript' ,

            'serialized' => 'application/vnd.php.serialized',
            'php'        => 'text/plain',
            'html'       => 'text/html',
            'csv'        => 'application/csv',
       );

のようにjsonを除外しちゃえばOKです。

ふむ、なるほど。

まとめるとレストコントローラの返却形式は

1.変数「$format」が定義されていたらそれ
2.URLで拡張子が指定されていたらそれ
3.HTTPヘッダのmimeタイプ(rest.phpのignore_http_acceptがfalseの場合)
4.rest.phpのdefault_format

の順で適用されるようです。

なるほどねー、完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:FuelPHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事