[Site] コンポーネント化する

タグ :

作成サイト「koweboo」についてまとめるシリーズです。
今回はコントローラの処理のコンポーネント化についてです。
ユーザー名の取得など、同じような処理を色んなところで使用するようになってきたので、コンポーネント化してみます。

コンポーネントの基礎知識に関しては過去記事「基礎(構造2)」を参照してみてください。

コンポーネント化する処理

コミュニティサイトに限らず、サイトというのは異なるページでも同じようなデータを取得することが多々あると思います。
今回の作成サイトでは以下が挙げられます。

  • ユーザー名取得
  • お題情報取得
  • 音声情報取得
  • …etc

特にユーザー名の取得は、お題を投稿したユーザー、音声をアップロードしたユーザー、ログインしているユーザーなど取得所はたくさんです。

コンポーネントの使い方

コンポーネントを使うには、「/app/Controller/Component/」内に「xxxComponent.php」を作成して、その中に処理を記述します。
今回は、ファイル名を TopicComponent.php としました。
記述法は以下のように書きます。

class TopicComponent extends Object {
	function initialize(){}
	function beforeRender(){}
	function shutdown(){}
	function startup(&$controller) {
		$this->Controller = & $controller;
	}
	function 関数名() {
		~ 処理 ~
	}
}

2行目〜7行目はコンポーネントを使用する際の決まり文句だと思ってください。
これが無いとエラーが出ます。
上記のようにコンポーネントを用意したら、コントローラ内で以下のように記述して使用します。

public $components = array('Topic');
function index() {
	$this->Topic->関数名();
}

1行目の「このコンポーネントを使いますよ〜」的な宣言が必要な点に注意してください。

コンポーネントの作成

実際に今回の作成サイトでコンポーネントを作成してみます。
特によく使用する「ユーザー名取得」の処理をコンポーネント化します。
TopicComtonent.php へ以下のコードを記述します。

class TopicComponent extends Object {
	function initialize(){}
	function beforeRender(){}
	function shutdown(){}
	function startup(&$controller) {
		$this->Controller = & $controller;
	}
	function GetUserName($model, $cdt) {
		// ユーザーID取得
		$model->contain('User');
		$user_id = $model->find('list', array(
			'conditions' => $cdt,
			'fields' => 'user_id'
		));
		// ユーザー名取得
		$model->User->contain('Profile');
		$users = $model->User->find('all', array(
			'conditions' => array('User.id' => $user_id),
			'fields' => 'id'
		));
		// まとめ
		$data = array();
		foreach($users as $user) {
			$data[$user['User']['id']] = array(
				'id' => $user['Profile'][0]['user_id'],
				'name' => $user['Profile'][0]['name']
			);
		}
		
		return $data;
	}
}

8行目で関数を定義しています。
引数に使用元のモデル(VoicesController.php で使用するなら「$this->Voice」を渡す)と、取得条件を持たせています。

10行目〜28行目の処理は、コントローラ内に記述していた処理と同じ内容です。

30行目では、まとめたデータを戻り値として返しています。
どのようなデータが返るかは、過去記事「ユーザーIDをユーザー名に変更」を参照してください。

音声をアップロードしたユーザー名を取得する場合には、「VoicesController.php」内で以下のようにしてコンポーネントを使用します。

$user_voice = $this->Topic->GetUserName(
		$this->Voice,
		array('Voice.id' => $voice_id)
	);

コンポーネント化する前と同じデータが取得できているので、問題無く動作できていると思います。
この調子で多用しそうな処理はどんどんコンポーネント化していきたいと思います。

Share

  • このエントリーをはてなブックマークに追加

Comment

コメントを残す

*がついている欄は必須項目です。

  • Twitter
  • Facebook
  • Google Plus
  • RSS Feed