2012年11月20日火曜日

Controller_HybridのafterでTemplateかRestか

特殊な例かもしれませんが、もともとController_Templateで作っていたコントローラをController_Hybridに変えたときにちょっと手間取ったのでメモ。

サンプルとして良いのか悪いのかわからないですが、
もともとのソースは
class Controller_category extends Controller_Template
{
    public function after($response)
    {
        $this->template->title = 'カテゴリ';
        return parent::after($response);
    }

    public function action_index()
    {
        $categories = Model_Category::find()->get();

        $this->template->content = View::forge('category/index');
        $this->template->content->set('categories', $categories);
    }
}

こんなかんじ。
afterの処理でテンプレートに対して値をセットしています。

これをController_Hybridに単純に変えて実装してみました。
class Controller_category extends Controller_Hybrid
{
    public function after($response)
    {
        $this->template->title = 'カテゴリ';
        return parent::after($response);
    }

    public function action_index()
    {
        $categories = Model_Category::find()->get();

        $this->template->content = View::forge('category/index');
        $this->template->content->set('categories', $categories);
    }

    public function get_list()
    {
        $categories = Model_Category::find()->get();

        $data = array();
        foreach ($categories as $category) {
            $data[$category->id] = $category->name;
        }

        $this->response($data);
    }
}

変更したところはController_Hybridにした点とget_listというRest用のアクションメソッド。
しかし、これだとController_Templateを使うような画面は良くても、Controller_Restを使うようなRESTfulな処理で正しく出力してくれません。
というかエラーになります。

エラーの内容は
ErrorException [ Warning ]: Attempt to assign property of non-object

Controller_Restを使ってるから$this->templateなんてないよ、的なエラー。
調べてみると、ないよー的なエラーではなくController_Hybridを使ってRESTfulな処理をしている場合、$this->templateには"template"という文字列がセットされています。
(Controller_Hybridでなくてもそうかもしれません)
これでは確かにエラーになります。

afterの中でどうにかしてTemplateなのかRestなのか判定したい場合は、
public function after($response)
{
    if (! $this->is_restful())
        $this->template->title = 'カテゴリ';

    return parent::after($response);
}

これでOK。
Controller_Hybridの中でも使われているメソッドになりますが、これで処理を判定することができます。

もしくは
public function after($response)
{
    if ($this->template instanceof View)
        $this->template->title = 'カテゴリ';

    return parent::after($response);
}

これでも判定はできています。
どういうやり方がいいか、模索中ではありますがどちらが良いのでしょうかね。
というかこれでいいのかな?と思いもします。

何か良い方法あれば教えてください。


0 件のコメント:

コメントを投稿