自作のコンポーネントでモデルを使うときはどうしていますか?
コントローラで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; } }
- 正しいのかどうかは別として [↩]