CakePHP: независимые манипуляции с моделями

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

//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
}

Or:

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

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

Спасибо за помощь !


person Pierre Roudaut    schedule 19.05.2016    source источник
comment
Вы уверены, что хотите избежать СУХОЙ, я думаю, что вы хотите достичь этого? Что именно вы не хотите повторять? Это действительно просто вызовы Model::find() или на самом деле все сложнее? Если последнее имеет место, то, пожалуйста, уточните это, потому что обертывание простого вызова Model::find() не имеет особого смысла.   -  person ndm    schedule 19.05.2016
comment
На самом деле, это действительно больше, чем просто метод Model:find()... По сути, все операции CRUD, которые я выполняю с моделями, абсолютно одинаковы, поэтому я хотел бы провести их рефакторинг в AppController напрямую. Итак, чего я действительно пытаюсь достичь, так это манипулировать моделью абстрактным образом. Использование Controller:loadModel($this-›modelClass) загружает правильную модель, но тогда как я могу использовать эту модель для вызова методов Model:save() или Model:find()?   -  person Pierre Roudaut    schedule 19.05.2016
comment
Мммм, я все еще не уверен, что понимаю вашу настоящую проблему... может быть, вы спрашиваете, как использовать значение $this->modelClass для доступа к свойству объекта?   -  person ndm    schedule 19.05.2016
comment
Наконец-то я нашел способ добиться того, чего хотел: $this->{$this->modelClass}->find('all');   -  person Pierre Roudaut    schedule 19.05.2016


Ответы (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
}
person Pierre Roudaut    schedule 19.05.2016