アプリケーションを作成していると、何度も同じような処理をプログラミングすることがあります。
そのような場合には、早めに共通部品化にして、重複処理を避けたいものです。
CakePHPには、Componentで共通部品化ができます。
本記事では、簡単なサンプルを例に示しながら、Component化する手順を解説しています。
bake component の実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[hogehoge@sv7108 app]$ ./bin/cake bake component Common Welcome to CakePHP v3.1.14 Console --------------------------------------------------------------- App : src Path: /home/hogehoge/example.com/public_html/apl/app/src/ PHP : 5.4.16 --------------------------------------------------------------- Creating file /home/hogehoge/example.com/public_html/apl/app/src/Controller/Component/CommonComponent.php Wrote `/home/hogehoge/example.com/public_html/apl/app/src/Controller/Component/CommonComponent.php` Baking test case for App\Controller\Component\CommonComponent ... Deleted `/home/hogehoge/example.com/public_html/apl/app/tests/TestCase/Controller/Component/empty` Creating file /home/hogehoge/example.com/public_html/apl/app/tests/TestCase/Controller/Component/CommonComponentTest.php Wrote `/home/hogehoge/example.com/public_html/apl/app/tests/TestCase/Controller/Component/CommonComponentTest.php` |
下記の構成で、Componentファイルが生成されます。
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 |
/home/hogehoge/example.com/public_html/apl/app/src |--Console | |--Installer.php |--Controller | |--AppController.php | |--Component | | |--CommonComponent.php | |--PagesController.php |--Model | |--Behavior | | |--empty | |--Entity | | |--User.php | |--Table | | |--UsersTable.php |--Shell | |--ConsoleShell.php |--Template | |--Element | | |--Flash | | | |--default.ctp | | | |--error.ctp | | | |--success.ctp | |--Pages | | |--home.ctp | |--Users | | |--add.ctp | | |--edit.ctp | | |--index.ctp | | |--view.ctp |--View | |--AjaxView.php | |--AppView.php | |--Helper |
共通メソッドの追加
生成されたComponentに、共通化したいメソッドを追加していきます。
今回の例では、getHello メソッドを定義します。
1 2 3 |
CommonComponent.php <!--?php namespace App\Controller\Component; use Cake\Controller\Component; class CommonComponent extends Component { public function getHello($name) { return $name . " hello!"; } } ?--> |
ここで生成したComponentを、Contorllerから呼び出します。
1 |
<!--?php namespace App\Controller; use App\Controller\AppController; class HogeController extends AppController { public function initialize() { parent::initialize(); $this-&gt;loadComponent('Common'); } public function test() { $res = $this-&gt;Common-&gt;getHello('hogehoge'); echo $res; } } &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;&lt;br ?--> |
ComponentからModelを利用する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
CommonComponent.php namespace App\Controller\Component; use Cake\Controller\Component; use Cake\ORM\TableRegistry; ※ 追加すること class CommonComponent extends Component { public function initialize(array $config) { $this->Users = TableRegistry::get("Users"); ※ モデル名を設定 } public function getUser($name) { $res = $this->Users->find('all') ->where([ 'name like ' => $name ] ); } } |