[CakePHP3]デフォルトのページネーション設定をカスタムしよう!

2016-04-21


こんなコード。AppControllerのbeforeFilterだと検索前になっちゃうので、beforeRenderで。

    public function beforeRender(Event $event)
    {
        // ・・・

        // ページネーションはindexで使う
        if($this->request->action == "index") {
            // カスタムのサンプル。全テーブルにidというカラムがあるという前提のもと、id降順
            $this->paginate["order"] = ["id" => "DESC"];
            // テーブル名=Controller名なのでnameプロパティでアクセス可能
            $rows = $this->paginate($this->{$this->name});

            // ここがキモ。デフォルトのbakeコードでは、先頭小文字のキャメルケースで検索結果をset。
            // なのでvariableで変換して上書き
            $this->set(Inflector::variable($this->name), $rows);
            $this->set('_serialize', [Inflector::variable($this->name)]);
        }
    }

問題は、各コントローラのindex関数での検索処理が無駄になること!
 ※ので、仕事ではbake templateを書き換えて対応したけど、、、

indexで使うpaginateプロパティの設定をAppControllerとか、外からいじれればいいんだけどなー

  // 今のindex()。。。index前、例えばbeforeFilterでpaginateの設定しても上書きされちゃう
  $this->paginate = ["contain" => ["hoge", "hogehoge"]];

ので、例えば↓みたいになれば、beforeFilterで設定できそう。containはだめだけど、、、

  // こんなふうならいいのにな~。containって多次元配列も使えたかもだけど、
  // このコードはドット記法前提。
  array_merge($this->paginate["contain"], ["hoge", "hogehoge"]);

でも外からいじれるようになってない、ってことは、なんか今のコードに意味があるんだろうかね?変にカスタムされるとバグるとか・・・

最近のマイトレンドがいかにbake生成コード、さらにbake templateもデフォルトのままでシステムを作るか、ってことでこんなTIPSでした。
bake templateをいじる開発方法で作ったこともあって、それはそれで問題なかったんだけど、本家bake templateのバグFIXを取り込めなくなるのが辛い。