cakephp-в чем разница между моделью и поведением?
Я понимаю, что поведение должно расширять модель и добавлять к ней функциональность, но в большинстве случаев идея fat-модели делает поведение бесполезным, не так ли?
и, даже предпочтительнее, игнорировать мой первый абзац и просто ответить-пожалуйста-вопрос в названии, и добавить пример, чтобы сделать его понятным
спасибо
3 ответов
поведение-это когда вы извлекаете код, который на самом деле не принадлежит одному конкретному домену моделей. Например, вспомогательные функции или mixin / module (если вы знакомы с этим шаблоном из других языков программирования).
Если вы знакомы с помощниками и компонентами CakePHP, вы можете посмотреть на это так. Поведение должно моделироваться как помощник для просмотра как компонент для контроллера. В основном набор функций, которые будут использоваться через несколько модели.
предположим, вы хотите реализовать мягкое удаление на всех моделях в вашем приложении. (Мягкое удаление означает, что вы фактически не удаляете запись, вы просто отмечаете ее как удаленную). Вы не хотите помещать один и тот же код мягкого удаления в каждую модель. Это не очень сухо! Вместо этого вы используете поведение, чтобы абстрагировать функциональность таким образом.
то, что мы пытаемся сделать, это вместо удаления записи обновить столбец "удалено" с текущей датой (это будет работать так же, как создано, изменено). Затем мы изменим метод find, чтобы получить только записи, которые не удаляются.
// 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
}
}
Я надеюсь, это поможет вам.
поведение может быть разделено между моделями. Обычно поведение содержит абстрактный код, который можно применить к любой - модели.
хотя вы, конечно, можете написать это для одной модели, вам придется написать это снова для другой модели. Абстрагируя его для совместного использования, вы создали поведение.
в CakePHP a поведение до модель это те же отношения, что и компонент в а контроллер или помощник до посмотреть.
примером основного поведения в CakePHP является Containable. Это позволяет вам иметь более точный контроль над отношениями, используемыми в find()
.
в основном поведение используется, чтобы сделать ваше приложение сухим! и повторное использование кода...