サンプルとして良いのか悪いのかわからないですが、
もともとのソースは
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 件のコメント:
コメントを投稿