CakePHP: Manual/Developing/Behaviors/UsingBehaviors

Использование поведений

Поведения подключаются к модели с помощью переменной класса модели $actsAs:

<?php

class Category extends AppModel {

    var $name   'Category';

    var $actsAs = array('Tree');

}

?>

Этот пример показывает, как модель Category будет управлять структурой дерева, используя поведение TreeBehavior. После того, как поведение определено, вы можете использовать методы, добавленные поведением, также, как оригинальные методы модели:

<?

// Установка ID

$this->Category->id 42;

// Использование метода поведения children():

$kids $this->Category->children();

?>

Некоторые поведения могут требовать или позволять делать установки, когда поведение подключается к модели. Здесь мы сообщаем поведению TreeBehavior имена полей “left” и “right” в таблице базы данных:

<?php

class Category extends AppModel {

    var $name   'Category';

    var $actsAs = array('Tree' => array(

        'left'  => 'left_node',

        'right' => 'right_node'

    ));

}

?>

Мы также можем подключить несколько поведений к модели. Почему, например, наша модель Category должна вести себя только как дерево, она также может нуждаться в поддержке интернационализации:

<?php

class Category extends AppModel {

    var $name   'Category';

    var $actsAs = array(

        'Tree' => array(

          'left'  => 'left_node',

          'right' => 'right_node'

        ),

        'Translate'

    );

}

?>

Итак, мы добавляли поведения к моделям, используя переменную класса модели. Это означает, что наши поведения будут прикреплены к моделям на протяжении всего времени существования модели. Однако, нам может потребоваться «отсоединение» поведений от нашей модели в момент выполнения программы. Допустим, нам необходимо, чтобы наша предыдущая модель Category, которая действует как Tree и Translate, перестала действовать, как модель Translate:

<?

// Отсоединение поведения от нашей модели:

$this->Category->Behaviors->detach('Translate');

?>

После этого действия наша модель Category перестанет вести себя как модель Translate. Вместо отключения поведения, возможно, нам нужно будет просто запретить поведению Translate действовать на обычные операции модели: find, save, и т.п. В действительности, мы заботимся о запрещении поведению действовать на колбэки модели. Вместо отключения поведения мы говорим нашей модели остановить информирование поведения Translate об этих колбэках:

<?

// Запрещаем поведению управлять колбэками модели

$this->Category->Behaviors->disable('Translate');

?>

Мы также можем узнать управляет ли поведение колбэками модели. И если не управляет, то мы можем восстановить способность поведения действовать на них:

<?

// Если наше поведение не управляет колбэками модели

if (!$this->Category->Behaviors->enabled('Translate')) {

    // говорим ему начать управлять колбэками

    $this->Category->Behaviors->enable('Translate');

}

?>

Также, как мы можем полностью отключить поведение от модели в процессе выполнения программы, мы можем и подключить новые поведения. Допустим, что наша модель Category должна начать вести себя как модель Christmas, но только в Рождество:

<?

// Если сегодня 25 декабря

if (date('m/d') == '12/25') {

    // Наша модель должна вести себя как модель Christmas

    $this->Category->Behaviors->attach('Christmas');

}

?>

Мы также можем использовать метод attach для перезаписи настроек поведения:

<?

// Мы изменим одну установку по сравнению, с уже подключенным поведением

$this->Category->Behaviors->attach('Tree', array('left' => 'new_left_node'));

?>

Существует метод получения списка подключенных к модели поведений. Если мы передадим методу имя поведения, то он сообщит нам подключено ли это поведение к модели, иначе он вернет нам список всех подключенных поведений:

<?

// Если поведение Translate не подключено

if (!$this->Category->Behaviors->attached('Translate')) {

    // Получаем список всех поведений, подключенных к модели

    $behaviors $this->Category->Behaviors->attached();

}

?>

<< Поведения | Создание пользовательских поведений >>