自作のコンポーネントでモデルを使うときはどうしていますか?
コントローラでusesしているモデルであれば
class HogeComponent extends Component {
public function initialize(Controller $controller) {
$this->controller = $controller;
}
// コントローラでusesされたモデルを使う
public function test() {
$this->controller->{モデル名}->find(...);
}
}
とこんな感じで使えますが、controllerと書かなければならない分記述が長くなるし、呼び出し元のコントローラでusesしていないとエラーになってしまいますよね。
なので、最近は自作のコンポーネントに以下のようなメソッドを作って利用しています。
private function loadModel($modelName) {
if (!empty($this->controller->{$modelName})) {
// 呼び出し元のコントローラでusesしてあれば$this->{モデル名}に参照渡し
$this->{$modelName} = $this->controller->{$modelName};
} else {
// コントローラでusesしていなければコンポーネントでモデルを読み込む
App::uses($modelName, 'Model');
$this->{$modelName} = new $modelName;
}
}
コントローラのloadModelと同じように使えるので便利*1です。
8/26追記
すでに$this->{モデル名}が存在する場合に対応
private function loadModel($modelName) {
if (!empty($this->{$modelName})) {
// すでに存在すればそのままreturn
return;
} elseif (!empty($this->controller->{$modelName})) {
// 呼び出し元のコントローラでusesしてあれば$this->{モデル名}に参照渡し
$this->{$modelName} = $this->controller->{$modelName};
} else {
// コントローラでusesしていなければコンポーネントでモデルを読み込む
App::uses($modelName, 'Model');
$this->{$modelName} = new $modelName;
}
}
- 正しいのかどうかは別として [↩]
