プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
FuelPHP1.6、レストコントローラ(Controller_Rest)の404エラー時の挙動を理解する
FuelPHPでは該当するURLが存在しない場合、
あらかじめ用意された404エラーページを表示してくれます。

細かいことは「FuelPHP1.6、「action_404()」について理解する」を見てくださいなのですが、
Controller_Restの場合は多分挙動が異なるよね(--?というのが今回のテーマです。

まずは中身を見てみましょうかね。
Controller_Restで該当アクションメソッドが無い場合はこんな処理みたいですφ(--)

■fuel/core/classes/controller/rest.php 135行目近辺
//If the request passes auth then execute as normal
if(empty($this->auth) or $valid_login)
{
    // If they call user, go to $this->post_user();
    $controller_method = strtolower(\Input::method()) . '_' . $resource;

    // Fall back to action_ if no rest method is provided
    if ( ! method_exists($this, $controller_method))
    {
        $controller_method = 'action_'.$resource;
    }

    // If method is not available, set status code to 404
    if (method_exists($this, $controller_method))
    {
        return call_user_func_array(array($this, $controller_method), $arguments);
    }
    else
    {
        $this->response->status = $this->no_method_status;
        return;
    }

}



else
{
    $this->response->status = $this->no_method_status;
    return;
}

の部分ですね。
「$this->response->status」に「405」を設定して返却しているみたいです。

なるほど。理解しました(--)

ここを適当にいじればController_Restでアクションメソッドが無い場合の挙動を
あーだこーだ好きにいじくれるのですね。

例えば

else
{
//    $this->response->status = $this->no_method_status;
//    return;
    throw new \HttpNotFoundException();
}

とやれば他のコントローラ同様あらかじめ用意された404エラーページが表示されるし、
Controller_Restを継承したコントローラ内に自前で404用のアクションメソッドを用意して

else
{
//    $this->response->status = $this->no_method_status;
//    return;
    return call_user_func_array(array($this, 'action_404'), $arguments);
}

とか無理やりやることで404エラー時の挙動をカスタマイズできるようです。

まぁ原則として「fuel/core/」配下は触らないのがお約束なので、
実際にはrouter()メソッドをオーバーライドしてやることになるでしょうけどね。

例えばこんな感じφ(--)

■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 action_index()
    {
        print "action_index";
    }

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

    public function router($resource, $arguments)
    {

~~ 省略 ~~

            // If method is not available, set status code to 404
            if (method_exists($this, $controller_method))
            {
                return call_user_func_array(array($this, $controller_method), $arguments);
            }
            else
            {
//                $this->response->status = $this->no_method_status;
//                return;
                return call_user_func_array(array($this, 'action_404'), $arguments);
            }
        }
        else
        {
            $this->response(array('status'=> 0, 'error'=> 'Not Authorized'), 401);
        }
    }

    public function action_404()
    {
        $this->response(
            array(
                'err_code' => array(
                    404
                ),
                'err_msg' => array(
                    'error'
                ),
            )
        );
    }

}

このやり方はかっちょ悪いことこの上ないですね(-A-)
個人的にはこーゆーやり方が必要になったら素直に設計を変えるべきだと思います。

……が、世の中理想論だけでは突っ走れないところもあるので
搦め手も押さえておかなくてはいけないのです。

取りあえず、完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

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

  関連記事