- 更新日: 2015年10月14日
- PHP & CakePHP
CakePHP3でコントローラーの共通処理(コンポーネント)
CakePHP3 で Controller の Component(コントローラーで共通して使うコンポーネント)を作成していたところ、以下のエラーに遭遇しました。
1 2 3 |
Fatal error: Class 'Component' not found |
CakePHP 3 についてはまだウェブ上の情報が少ないこともあって、解決するのに苦労したのでメモ。Rails でもそうですけど、名前空間の解決とかロードパスとか、その辺りはウェブアプリケーションフレームワークのはまりやすい箇所のように感じます。
— 環境 —
CakePHP 3.1.1
PHP 5.5.19
コントローラーのコンポーネント作成
CakePHP でコントローラーで使いまわしたいような共通の処理は、src/Controller/Component 以下に作成する。例として、挨拶のコンポーネント(GreetingComponent)を作成してみます。
src/Controller/Component/GreetingComponent.php
1 2 3 4 5 6 7 8 9 10 |
<?php namespace App\Controller\Component; use Cake\Controller\Component; class GreetingComponent extends Component { public function hello() { return "hello world!"; } } |
hello world! を返す hello() メソッドを持つコンポーネントです。実は、この GreetingComponent での namespace と use の設定が当初上手くいかず、それが冒頭のエラー発生の原因でした。上記のように正しく書くとエラーが消えます。
コンポーネントを使うコントローラーを作成
UsersController から GreetingComponent を使います。
src/Controller/UsersController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php namespace App\Controller; use App\Controller\AppController; class UsersController extends AppController { public $components = ['Greeting']; public function hello() { $hello = $this->Greeting->hello(); $this->set('hello', $hello); } } |
$components に使うコンポーネントを配列で指定する。クラス名から Component を除いた名前で指定します。その後は、$this->Greeting でコンポーネントにアクセスできる。
ビューとルーティング
続いて、以下のビューファイルとルーティングを作成。
src/Template/Users/hello.ctp
1 |
<?= h($hello) ?> |
config/routes.php
1 2 3 4 5 |
// Users#hello Router::scope('/users', ['controller' => 'Users'], function ($routes) { $routes->connect('/hello', ['action' => 'hello']); } ); |
サーバーを起動して動作確認
CakePHP 開発環境のサーバー起動。
1 2 3 |
$ bin/cake server |
localhost:8765/users/hello にアクセスして、「hello world!」が表示されればOKです。
最初冒頭のエラーが発生した後に、色々といじって試していたら、以下のメッセージがブラウザのエラー画面で表示されました。このメッセージのおかげで、正しい namespace と use の設定の書き方が分かった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
GreetingComponent could not be found. Error: Create the class GreetingComponent below in file: src/Controller/Component/GreetingComponent.php <?php namespace App\Controller\Component; use Cake\Controller\Component; class GreetingComponent extends Component { } |
以上 CakePHP 3 で、コントローラーのコンポーネント作成についてでした。
- – 参考リンク –
- CakePHP 共通処理の扱い方(module) まとめ – Qiita
- PHP & CakePHP の関連記事
- PHP+MySQLでNo such file or directoryエラー
- bin/cakeコマンドでintlエラーが出る場合の対処(CakePHP)
- CakePHPアプリケーションをCapistranoでデプロイ
- Integrity constraint violation:Column ‘created’ in order clause is ambiguousエラー/CakePHP
- CakePHPでDB関連テーブルのレコード・データを取得
- CakePHPでカラム属性に別名/エイリアスを付ける仮想フィールド
- CakePHPで日付選択フォームのカスタマイズ
- CakePHP3で現在のコントローラー名・アクション名を取得
- PHPインストールでconfigure: error: freetype.h not foundエラー
- CakePHPでログイン後に元のページにリダイレクトさせる
- 初回公開日: 2015年10月11日
Leave Your Message!