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();
}
?>


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