Пользовательские типы получения данных (custom find types) в CakePHP

November 28, 2008 | By admin | Filed in: CakePHP, Переводы.

Оригинал

Пару месяцев назад Nate Abele написал статью для C7Y о новом синтаксисе CakePHP 1.2.

В бета-версии CakePHP 1.2 можно использовать новый синтаксис для получения данных из БД, т.е., например, вместо вызова методов вроде findAll() вы можете писать find(“all”). Это позволяет добиться большей гибкости и возможности повторного использования кода.

Далее приведены примеры того, как можно создать свои типы получения данных, такие как “find(’popular’).” После прочтения той статьи я начал пользоваться описанными техниками повсеместно. Очень часто я вставляю один и тот же код в модель:

public function find($type, $options = array()) {
switch ($type) {
case "custom":
return $this->__findCustom($options);
default:
return parent::find($type, $options);
}
}

Я перенес данный блок в AppModel, и теперь этот код можно использовать во всех моделях приложения:

class AppModel extends Model {
function find($type, $options = array()) {
$method = null;
if(is_string($type)) {
$method = sprintf('__find%s', Inflector::camelize($type));
}

if($method && method_exists($this, $method)) {
return $this->{$method}($options);
} else {
return parent::find($type, $options);
}
}
}

Как это работает

Допустим, вы хотите получить последние 10 комментариев к блогу. Обычный способ сделать это:

$comments = $this->Comment->find('all', array('conditions' => array('spam' => false),
'order' => array('created' => 'desc'),
'limit' => 10));

При использовании собственного типа получения данных, код в контроллере преобразуется в:

$comments = $this->Comment->find('latest); 

А в модели Comment появляются следующие строки:

function __findLatest($options) {
return  $this->find('all', array('conditions' => array('spam' => false),
'order' => array('created' => 'desc'),
'limit' => 10));
}

Наш новый метод в AppModel автоматически ищет метод “__findLatest” в соответствующей модели. Если таковой существует, он вызывается и возвращает данные. В противном случае вызывается родительский метод, который обрабатывает стандартные виды получения данных (all, first, count…).


Tags: ,

2 comments on “Пользовательские типы получения данных (custom find types) в CakePHP

  1. Timur Alhimenkov says:

    Очень понравился этот пост. Можно я к себе на блог скопирую? Ссылку на источник обязательно поставлю.

    ____
    С уважением, Тимур.

  2. admin says:

    Можно 🙂

Leave a Reply