2016-05-19 11 views
0

Есть ли способ получить/манипулировать моделью агностически в AppController, чтобы избежать сушки в контроллерах приложения? Например:CakePHP: манипуляция с агностикой

//AppController.php 
public function find_all() 
{ 
    return $this->AppModel->find('all'); 
    //I know this does not work but to give you the idea 
} 

И у детей контролеров приложения:

//FoosController.php 
public function some_function() 
{ 
    $data = parent::find_all(); 
    //List of Foo entities 
} 

Или:

//BarsController.php 
public function some_other_function() 
{ 
    $data = parent::find_all(); 
    //List of Bar entities 
} 

Есть ли решение CakePHP может обеспечить? Или, может быть, размышления?

Благодарим за помощь!

+0

Вы уверены, что хотите _avoid_ DRYness, я думаю, что вы захотите _achieve_ it? Что именно вы не хотите повторять? Действительно ли это просто вызовы 'Model :: find()', или есть ли на самом деле более сложная задача? Если это так, то просьба уточнить это, потому что упаковка простого вызова 'Model :: find()' не имеет особого смысла. – ndm

+0

На самом деле это действительно больше, чем просто метод Model: find() ... В принципе, все операции CRUD, которые я выполняю на моделях, абсолютно одинаковы, поэтому я бы хотел их реорганизовать в непосредственно в AppController. Так что я действительно пытаюсь достичь - это манипулировать моделью абстрактным образом. Использование контроллера: loadModel ($ this-> modelClass) загружает нужную модель, но затем, как я могу использовать эту модель для вызова методов Model: save() или Model: find()? –

+0

Мммм, я все еще не уверен, что понимаю вашу реальную проблему ... возможно, вы спрашиваете, как использовать значение '$ this-> modelClass' для доступа к объекту? – ndm

ответ

1

Я придумал, как добиться того, что я искал:

//AppController.php 
public function find_all() 
{ 
    return $this->{$this->modelClass}->find('all'); 
} 

ПРИМЕЧАНИЯ: При выполнении операции повторяющихся CRUD без какой-либо реальной бизнес-логики или разрешений на участии (как я в настоящее время нахожусь), вы также можете использовать эти строки кода для продолжения работы, не зная о модели, которая обрабатывается в AppController.

//AppController.php 
if (!$this->{$this->modelClass}->save($this->request->data)) 
{ 
    $validationErrors = $this->{$this->modelClass}->validationErrors; 
    //error logic here 
} 
else 
{ 
    //success logic here 
}