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().


в основном поведение используется, чтобы сделать ваше приложение сухим! и повторное использование кода...

, проверьте эту ссылку... это дает вам простое поведение тегов, которое вы можете использовать в своей модели post