cakephp - в чем разница между моделью и поведением? - PullRequest
6 голосов
/ 31 августа 2011

Я понимаю, что поведение должно расширять модель и добавлять к ней функциональность, но в большинстве случаев идея толстой модели делает поведение бесполезным, не так ли?

И, даже предпочтительнее, проигнорируйте мой первый абзац и просто ответьте - пожалуйста - на вопрос в заголовке, и добавьте пример, чтобы прояснить его

спасибо

Ответы [ 3 ]

23 голосов
/ 02 сентября 2011

В поведении вы извлекаете код, который на самом деле не принадлежит ни одному конкретному домену моделей. Вроде как, вспомогательные функции или миксин / модуль (если вы знакомы с этим шаблоном из других языков программирования).

Если вы знакомы с помощниками и компонентами 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
    }
}

Надеюсь, это поможет вам.

3 голосов
/ 31 августа 2011

Поведения могут быть разделены между моделями. Обычно Поведение содержит абстрактный код, который можно применить к любой модели.

Хотя вы, конечно, могли бы написать это специально для одной Модели, вам придется написать это снова для другой Модели. Абстрагируя его для общего доступа, вы создали Поведение .

В CakePHP Поведение с Модель такое же отношение, как у Компонента с Контроллером или Помощником до Вид .

Пример основного поведения в CakePHP: Контейнер . Это позволяет вам лучше контролировать отношения, используемые в find().

1 голос
/ 31 августа 2011

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

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

...