コンポーネント
コンポーネントは、複数のコントローラー間で共有されるロジックのパッケージです。コントローラー間で何かをコピー&ペーストしている場合は、一部の機能をコンポーネントにラップすることを検討する必要があります。
CakePHP には、便利なコアコンポーネントの美しいセットも付属しています:
セキュリティ
セッション
アクセス制御リスト
メール
クッキー
認証
リクエストの処理
ページネーション
これらのコンポーネントの詳細は、それぞれの章に記載されています。 次に、独自のコンポーネントを構築する方法を説明します。 コンポーネントを作成すると、コントローラー コードがクリーンな状態に保たれ、複数のプロジェクトでコードを再利用できるようになります。
構成コンポーネント
一部のコアコンポーネントを設定する必要があります。構成する必要があるコンポーネントには、認証、Cookie、および電子メール コンポーネントが含まれます。 一般的なコンポーネントの場合、通常は $components 配列またはコントローラーの beforeFilter メソッドで構成されます。
1 クラス PostsController は AppController を拡張します {
2 public $components = array(
3 '認証' => array(
4 'authorize' => array('controller'),
5 'loginAction' => array('controller' => 'users', 'action' => 'ログイン')
6)、
7 'Cookie' => array('name' => 'CookieMonster')
8);
これは、$components 配列を使用してコンポーネントを構成する例です。すべてのコア コンポーネントでこの方法で構成できます。さらに、コントローラーの beforeFilter() メソッドでコンポーネントを構成できます。 このアプローチは通常、関数の結果をコンポーネントのプロパティに割り当てる必要がある場合に使用されます。上記の例は次のように表すこともできます:
1 パブリック関数 beforeFilter() {
2 $this->Auth->authorize = array('controller');
3 $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
4
5 $this->Cookie->name = 'CookieMonster';
6 }
ただし、コントローラーの beforeFilter() を実行する前に、コンポーネントの特定の構成オプションを設定する必要がある場合もあります。 最後に、一部のコンポーネントでは $components 配列で構成オプションを設定できます:
1 public $components = array(
2 'DebugKit.Toolbar' => array('panels' => array('history', 'session'))
3);
関連ドキュメントを参照することで、各コンポーネントでどのような構成オプションが提供されているかを確認できます。
className は、コンポーネントにエイリアスを与えることができるパブリック設定オプションです。このオプションは、$this->Auth または他のパブリック コンポーネントをカスタム実装に置き換える場合に便利です。
1 // app/Controller/PostsController.php
2 クラス PostsController は AppController を拡張します {
3 つのパブリック $components = array(
4 '認証' => array(
5 'className' => 'MyAuth'
6)
7 );
8 }
9
10 // app/Controller/Component/MyAuthComponent.php
11 App::uses('AuthComponent', 'コントローラー/コンポーネント');
12 クラス MyAuthComponent extends AuthComponent {
13 // コードを追加してコア AuthComponent をオーバーライドします
14 }
上記の例のコントローラーの $this->Auth のエイリアスは MyAuthComponent です。
メモ
エイリアスを持つコンポーネントを使用する場合は、他のコンポーネントでの参照も含めて、エイリアスを使用する必要があります。
コンポーネントを使用する
コントローラーにいくつかのコンポーネントを含めると、使用は非常に簡単です。コントローラー内の各要素は属性として使用されます。コントローラーに SessionComponent と CookieComponent をロードしている場合は、次のようにアクセスできます:
1 クラス PostsController は AppController を拡張します {
2 public $components = array('Session', 'Cookie');
3
4 パブリック関数 delete() {
5 if ($this->Post->delete($this->request->data('Post.id')) {
6 $this->Session->setFlash('投稿は削除されました。');
7 $this->redirect(array('action' => 'index'));
8 }
9 }
メモ
属性としてコントローラーに追加されたモデルとコンポーネントは同じ「名前空間」を共有するため、コンポーネントとモデルに同じ名前を付けないように注意する必要があります。
実行時にコンポーネントをロードする
すべてのコンポーネントをすべてのコントローラー メソッドで使用できる必要はない場合があります。 この場合、コンポーネント コレクションを使用して、実行時にコンポーネントをロードできます。 コントローラー内では次のように実行できます:
1 $this->OneTimer = $this->Components->load('OneTimer');
2 $this->OneTimer->getTime();
コンポーネントコールバック
コンポーネントは、リクエスト サイクルを延長できるようにするいくつかのリクエスト ライフサイクル コールバックも提供します。 コンポーネントによって提供されるコールバックの詳細については、「コンポーネント API」を参照してください。
コンポーネントを作成する
オンライン アプリケーションのさまざまな部分で複雑な数学的演算を実行する必要があるとします。いくつかの異なるコントローラーで使用するために、この共有ロジックをラップするコンポーネントを作成できます。
最初のステップは、新しいコンポーネント ファイルとクラスです。作成されるファイルは/app/Controller/Component/MathComponent.phpです。その基本構造は次のとおりです:
1 アプリ::uses('コンポーネント', 'コントローラー');
2 クラス MathComponent はコンポーネント {
を拡張します
3 パブリック関数 doComplexOperation($amount1, $amount2) {
4 $amount1 + $amount2を返します;
5 }
6 }
メモ
すべてのコンポーネントはコンポーネントを継承する必要があります。それ以外の場合は例外がスローされます。
コントローラーにコンポーネントを含める
コンポーネントが完成したら、コンポーネント名をコントローラーの $components 配列に入れることで、アプリケーション コントローラーで使用できます (「コンポーネント」セクションを参照)。コントローラーは、コンポーネントにちなんで名付けられた新しいプロパティを自動的に提供し、それを通じてコンポーネントのインスタンスにアクセスできます。
1 /* 新しいコンポーネント変数を生成 $this->Math
2 と標準の $this->セッション */
3 public $components = array('Math', 'Session');
AppController で定義されたコンポーネントは、他のコントローラーのコンポーネントとマージされます。したがって、同じコンポーネントを 2 回定義する必要はありません。
コントローラーにコンポーネントを含める場合、コンポーネントのコンストラクターに渡すパラメーターのセットを定義することもできます。これらのパラメータはコンポーネントによって処理されます:
1 public $components = array(
2 '数学' => 配列(
3 '精度' => 2,
4 'randomGenerator' => 'srand'
5)、
6「セッション」、「認証」
7);
このコードは、precision とrandomGenerator を含む配列を 2 番目のパラメーターとして MathComponent::__construct() に渡します。慣例により、コンポーネントに渡されるパブリック プロパティもこの設定に基づく値を持ちます。
コンポーネント内で他のコンポーネントを使用する
場合によっては、コンポーネントは他のコンポーネントも使用する必要があります。この場合、コントローラーにコンポーネントを含めるのと同じ方法で、`$components` 変数を使用して、あるコンポーネントを別のコンポーネント内に含めることができます。
1 // アプリ/コントローラー/コンポーネント/CustomComponent.php
2 App::uses('コンポーネント', 'コントローラー');
3 クラス CustomComponent はコンポーネント {
を拡張します
4 // コンポーネントが使用する他のコンポーネント
5 public $components = array('Existing');
6
7 パブリック関数Initialize(Controller $controller) {
8 $this->既存->foo();
9 }
10
11 パブリック関数 bar() {
12 // ...
13 }
14 }
15
16 // アプリ/コントローラー/コンポーネント/ExistingComponent.php
17 アプリ::uses('コンポーネント', 'コントローラー');
18 クラス ExistingComponent はコンポーネント {
を拡張します
19
20 パブリック関数 foo() {
21 // ...
22 }
23 }
コンポーネントAPI
クラスコンポーネント
コンポーネントの基本クラスは、ComponentCollection を通じて他のコンポーネントを遅延ロードし、パブリック設定を処理するためのメソッドをいくつか提供します。また、すべてのコンポーネント コールバックのプロパティも提供します。
Component::__construct(ComponentCollection $collection, $settings = array())
コンポーネントの基本クラスのコンストラクター。パブリック プロパティであるすべての $settings も、 settings 内で設定された値と一致する値を持ちます。
コールバック www.2cto.com
コンポーネント::初期化(コントローラー $コントローラー)
initialize メソッドは、コントローラーの beforeFilter メソッドの前に呼び出されます。
コンポーネント::startup(コントローラー $controller)
startup メソッドは、コントローラーの beforeFilter の後、コントローラーが現在のアクション処理を実行する前に呼び出されます。
コンポーネント::beforeRender(コントローラー $コントローラー)
beforeRender メソッドは、リクエスト アクション ロジックの実行後、コントローラーがビューとレイアウトをレンダリングする前に呼び出されます。
コンポーネント::shutdown(コントローラー $controller)
shutdown メソッドは、出力がブラウザーに送信される前に呼び出されます。
Component::beforeRedirect(コントローラー $controller, $url, $status=null, $exit=true)
beforeRedirect メソッドは、コントローラーのジャンプ メソッドが呼び出された後、他のすべてのメソッドが呼び出される前に呼び出されます。このメソッドが false を返した場合、要求されたリダイレクトは完了しません。 $url、$status、および $exit 変数は、コントローラー メソッドに対して同じ意味を持ちます。リダイレクト先の URL として文字列を返すことも、「status」要素と「exit」要素がオプションである「url」キーを含む連想配列を返すこともできます。
http://www.bkjia.com/PHPjc/477792.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/477792.html技術記事コンポーネント コンポーネントは、複数のコントローラ間で共有されるロジックのパッケージです。コントローラー間で何かをコピーアンドペーストしていることに気付いた場合は、一部の機能をコンポーネントにラップすることを検討する必要があります...