SOLG System Blog

fuelphpにて独自Controller作成

2015年10月05日

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

fuelphp
今回は開発で使用しているフレームワーク「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の独自ドライバの作成などに触れてみようかなっと思います。


同じカテゴリー(php)の記事画像
システム担当だけで作る管理画面のオススメ Bootstrap3のテンプレート
PHPカンファレンス2014参加しました!
Instagram APIから画像データを取得する方法
静岡の街中をクイズ会場に変える!!
同じカテゴリー(php)の記事
 システム担当だけで作る管理画面のオススメ Bootstrap3のテンプレート (2016-05-31 22:12)
 共有サーバのホスティングサービスについて総点検してみたよ (2014-11-24 00:17)
 PHPカンファレンス2014参加しました! (2014-10-26 22:01)
 見やすいソースコード (2014-02-16 17:15)
 Instagram APIから画像データを取得する方法 (2014-02-07 14:43)
 静岡の街中をクイズ会場に変える!! (2013-08-16 00:00)

Posted by iA SEチーム at 00:33│Comments(0)php
上の画像に書かれている文字を入力して下さい
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

PageTop

削除
fuelphpにて独自Controller作成
    コメント(0)