Controller内で共通の変数を定義する【CakePHP4】

基本

Controller内で複数回定義している、同じ内容の変数を共通化します。

修正前

src/Controller/SamplesController.php

・・・省略
class SamplesController extends AppController{
     public function index(){
          $data = "あいうえお";
          //重複箇所
     }
    
    public function add(){
         $data = "あいうえお";
         //重複箇所
    }
}

上記の例だとindex()とadd()に変数$dataの定義が重複しています。

内容も全く同じなので、一箇所で定義したいところです。

修正後

class SamplesController extends AppController{
      private $commonVariable;

      public function beforeFilter(\Cake\Event\EventInterface $event)
      {
           parent::beforeFilter($event);
           $this->commonVariable = "あいうえお";
      }

      public function index(){
          $data = $this->commonVariable;
      }
    
      public function add(){
          $data = $this->commonVariable;
      }
}

Controller内で共通で使う変数を定義できます。

この例ではコード量はあまり変わりませんが、共通化することで編集はしやすくなります。

利用例

Tableの定義を各関数で繰り返すのではなく、最初に共通化してしまいます。

class SamplesController extends AppController{
      private $usersTable;
      private $articlesTable;
      private $tagsTable;

      public function beforeFilter(\Cake\Event\EventInterface $event)
      {
           parent::beforeFilter($event);
           $this->usersTable = $this->getTableLocator()->get('Users');
           $this->articlesTable = $this->getTableLocator()->get('Articles');
           $this->tagsTable = $this->getTableLocator()->get('Tags');
      }

      public function index(){
         //※以下の2行が不要になる。
         //usersTable = TableRegistry::getTableLocator()->get('Users');
         //articlesTable = TableRegistry::getTableLocator()->get('Articles');

          $user = $this->usersTable->find()->where(["id"->1])->first();
          $article = $this->articlesTable->find()->where(["id"->1])->first();
      }
    
      public function add(){
          $user = $this->usersTable->find()->where(["id"->1])->first();
          $tag = $this->tagsTable->find()->where(["id"->1])->first();
      }

     public function edit(){
          $article= $this->articlesTable->find()->where(["id"->1])->first();
          $tag = $this->tagsTable->find()->where(["id"->1])->first();
      }
}

各関数内でTableRegistry内でテーブルを登録するよりも、コードをすっきりさせることができます。

コメント

タイトルとURLをコピーしました