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().
в основном поведение используется, чтобы сделать ваше приложение сухим! и повторное использование кода...
