fuelphpにて独自Controller作成
2015年10月05日
10月3日に開催された「phpカンファレンス2015」に参加してきました。
本来ならカンファレンスの内容について書くべきなのですが…
一緒に参加した後輩のためにネタを残しておこうかなということで、今回は別のネタを書こうと思います。
カンファレンスは来年も開催するとのことなので、興味があるかたは下記URLをごらんください。
http://phpcon.php.gr.jp/2015/

今回は開発で使用しているフレームワーク「fuelphp」の独自コントローラー作成について書いていきます。
fuelphpには複数のコントローラーが存在しますが、その中でHybrid_Controllerを継承する形でオリジナルのコントローラーを作成し、cakephpやzend_frameworkと同様にlayoutを指定でき、かつ、コントローラー名からtemplateを読み込むようにしました。
実際のソースが下記になります。
既存のHybride_Controller見ていただけるとわかりますが、beforeメソッドについてはそれほど変更はされていません。
変更点としては、以下の通りとなります。
・5行目でTrait_Initializeというトレイトを読み込み、12行目で読み込んだトレイトのinitメソッドを呼び出し、コントローラー名やアクション名などを取得
・24〜28行目でconfigからparserの取得、デフォルトで設定されているlayoutのテンプレートの内容取得
テンプレートについては、88行目で_get_parser_responseメソッドで内容を取得しており、
テンプレートのファイル名に「-mobile」をつけることで、PCとモバイルでそれぞれテンプレートを切り替えるようにしてます。
モバイルの場合、まず「-mobile」付きのテンプレートがあるかを判断し、ない場合は再帰的に「-mobile」なしのテンプレートを使用する仕組みです。
テンプレート名からPC、モバイルが判断できればいいため、もちろん「-mobile」のありなし以外でももちろん可能です。
次にafterメソッドですが、こちらは既存と比べ、色々と変更点があります。
変更点としては、以下の通りとなります。
・52行目でviewのテンプレートを取得
・55〜67行目で、viewの内容をcontentsにセットし、Controllerからlayoutが指定された場合は再度テンプレートの内容を取得、指定されていない場合は、beforeメソッドで取得したテンプレートの内容をそのまま使用
・Controllerで故意にviewを使用しないように指定されていない場合については、Controllerで指定された値などをグローバル変数を割り当てる
ただし、fuelphpの標準でできることはそのままにしておきたいので、response(Controllerの戻り値)がある場合、afterメソッドはresponseをそのまま戻します。
っといった感じで、すこし改造するとcakephpやzend_frameworkと同様にlayoutを指定でき、かつ、コントローラー名からtemplateを読み込むようにできます。
fuelphpを触り始めのころに作成したものなので、所々無駄なところがあったりしますが、参考にしていただければと思います。
また、ご意見、ご質問等ありましたら、コメントしていただけると幸いです。
では、今回はこのあたりで!
次回はsimpleauthの独自ドライバの作成などに触れてみようかなっと思います。
本来ならカンファレンスの内容について書くべきなのですが…
一緒に参加した後輩のためにネタを残しておこうかなということで、今回は別のネタを書こうと思います。
カンファレンスは来年も開催するとのことなので、興味があるかたは下記URLをごらんください。
http://phpcon.php.gr.jp/2015/

今回は開発で使用しているフレームワーク「fuelphp」の独自コントローラー作成について書いていきます。
fuelphpには複数のコントローラーが存在しますが、その中でHybrid_Controllerを継承する形でオリジナルのコントローラーを作成し、cakephpやzend_frameworkと同様にlayoutを指定でき、かつ、コントローラー名からtemplateを読み込むようにしました。
実際のソースが下記になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | class Controller_Original extends \Controller_Hybrid { use Trait_Initialize; public $template = 'layout/main' ; public $valid ; protected $parser ; public function before() { // 初期化処理 $this ->init(); // コンフィグ読み込み \Config::load( 'application' , true); \Config::load( 'sol' , true); \Config::load( 'const' , true); // setup the template if this isn't a RESTful call if (! $this ->is_restful()) { if (! empty ( $this ->template) && is_string ( $this ->template)) { // Load the template $parser = \Config::get( 'application.parser' ); $this ->parser = $parser ; $this ->template = $this ->_get_parser_response( $this ->template, \Agent::is_mobiledevice()); } } // Some Methods cant have a body $this ->request->body = null; // Which format should the data be returned in? $this ->request->lang = $this ->_detect_lang(); $this ->response = \Response::forge(); } public function after( $response ) { // return the template if no response is present and this isn't a RESTful call if (! $this ->is_restful() && empty ( $response )) { // 配列以外がセットされていた場合、空配列をセット if (! is_array ( $this ->aset)) { $this ->aset = array (); } $response = $this ->_get_parser_response( $this ->view, \Agent::is_mobiledevice()); // 指定されたtemplateを適用 if (! empty ( $this ->template)) { $this ->set( 'contents' , $response , false); if ( is_string ( $this ->template)) { $response = $this ->_get_parser_response( $this ->template, \Agent::is_mobiledevice()); } else { $response = $this ->template; } } // Viewが設定されていた場合、View用の値を設定する if (! empty ( $response )) { foreach ( $this ->aset as $key => $value ) { $response ->set_global( $key , $value [ 'value' ] , $value [ 'flag' ]); } } } return parent::after( $response ); } /** * parserのレスポンス取得 * @param $template * @param $mobile * @return null */ private function _get_parser_response( $template , $mobile ) { $response = null; $parser = $this ->parser; try { $file = $mobile ? $template . '-mobile' : $template ; $response = $parser ::forge( $file ); } catch (\Exception $e ) { // mobileの場合、再帰的にPCのチェックもする if ( $mobile ) { $response = $this ->_get_parser_response( $template , false); } } return $response ; } } |
既存のHybride_Controller見ていただけるとわかりますが、beforeメソッドについてはそれほど変更はされていません。
変更点としては、以下の通りとなります。
・5行目でTrait_Initializeというトレイトを読み込み、12行目で読み込んだトレイトのinitメソッドを呼び出し、コントローラー名やアクション名などを取得
・24〜28行目でconfigからparserの取得、デフォルトで設定されているlayoutのテンプレートの内容取得
テンプレートについては、88行目で_get_parser_responseメソッドで内容を取得しており、
テンプレートのファイル名に「-mobile」をつけることで、PCとモバイルでそれぞれテンプレートを切り替えるようにしてます。
モバイルの場合、まず「-mobile」付きのテンプレートがあるかを判断し、ない場合は再帰的に「-mobile」なしのテンプレートを使用する仕組みです。
テンプレート名からPC、モバイルが判断できればいいため、もちろん「-mobile」のありなし以外でももちろん可能です。
次にafterメソッドですが、こちらは既存と比べ、色々と変更点があります。
変更点としては、以下の通りとなります。
・52行目でviewのテンプレートを取得
・55〜67行目で、viewの内容をcontentsにセットし、Controllerからlayoutが指定された場合は再度テンプレートの内容を取得、指定されていない場合は、beforeメソッドで取得したテンプレートの内容をそのまま使用
・Controllerで故意にviewを使用しないように指定されていない場合については、Controllerで指定された値などをグローバル変数を割り当てる
ただし、fuelphpの標準でできることはそのままにしておきたいので、response(Controllerの戻り値)がある場合、afterメソッドはresponseをそのまま戻します。
っといった感じで、すこし改造するとcakephpやzend_frameworkと同様にlayoutを指定でき、かつ、コントローラー名からtemplateを読み込むようにできます。
fuelphpを触り始めのころに作成したものなので、所々無駄なところがあったりしますが、参考にしていただければと思います。
また、ご意見、ご質問等ありましたら、コメントしていただけると幸いです。
では、今回はこのあたりで!
次回はsimpleauthの独自ドライバの作成などに触れてみようかなっと思います。
システム担当だけで作る管理画面のオススメ Bootstrap3のテンプレート
共有サーバのホスティングサービスについて総点検してみたよ
PHPカンファレンス2014参加しました!
見やすいソースコード
Instagram APIから画像データを取得する方法
静岡の街中をクイズ会場に変える!!
共有サーバのホスティングサービスについて総点検してみたよ
PHPカンファレンス2014参加しました!
見やすいソースコード
Instagram APIから画像データを取得する方法
静岡の街中をクイズ会場に変える!!
Posted by iA SEチーム at 00:33│Comments(0)
│php