В поведении вы извлекаете код, который на самом деле не принадлежит ни одному конкретному домену моделей. Вроде как, вспомогательные функции или миксин / модуль (если вы знакомы с этим шаблоном из других языков программирования).
Если вы знакомы с помощниками и компонентами CakePHP, вы можете посмотреть на это следующим образом. Поведение относится к моделированию, поскольку помощник должен просматривать как компонент к контроллеру. В основном набор функций, которые будут использоваться в нескольких моделях.
Допустим, вы хотите реализовать мягкое удаление на всех моделях в вашем приложении. (Мягкое удаление означает, что вы на самом деле не удаляете запись, вы просто помечаете ее как удаленную). Вы не хотели бы помещать один и тот же программный код удаления в каждую модель. Это не очень СУХОЙ! Вместо этого вы используете поведение, чтобы абстрагировать функциональность следующим образом.
То, что мы пытаемся сделать, это вместо того, чтобы удалить запись, обновить столбец удаленных в текущую дату (она будет работать так же, как созданная, измененная). Затем мы изменим метод поиска, чтобы получать только те записи, которые не были удалены.
// models/behaviors/soft_deletable.php
class SoftDeletableBehavior extends ModelBehavior {
function setup(&$Model, $settings = array()) {
// do any setup here
}
// override the delete function (behavior methods that override model methods take precedence)
function delete(&$Model, $id = null) {
$Model->id = $id;
// save the deleted field with current date-time
if ($Model->saveField('deleted', date('Y-m-d H:i:s'))) {
return true;
}
return false;
}
function beforeFind(&$Model, $query) {
// only include records that have null deleted columns
$query['conditions']["{$Model->alias}.deleted <>"] = '';
return $query;
}
}
Тогда в вашей модели
Class User extends AppModel {
public $actsAs = array('SoftDeletable');
}
А из вашего контроллера вы можете вызывать все наши методы поведения для вашей модели
Class UsersControllers extends AppController {
function someFunction() {
$this->User->delete(1); // soft deletes user with id of 1
$this->User->find('all'); // this will not exclude user with an id of 1
}
}
Надеюсь, это поможет вам.