2011-08-30 22 views
6

Entiendo que se supone que el comportamiento amplía el modelo y le agrega funcionalidad, pero en la mayoría de los casos, la idea del modelo de grasa hace que el comportamiento sea inútil, ¿no es así?cakephp: ¿cuál es la diferencia entre el modelo y el comportamiento?

Y, aunque prefiere, ignorar mi primer párrafo y contestar simplemente - por favor - la pregunta del título, y añadir un ejemplo para que quede claro

gracias

Respuesta

22

Un comportamiento es en la que extrae el código que en realidad no pertenece a un dominio específico de los modelos. Tipo de funciones similares, auxiliares o mixin/module (si está familiarizado con ese patrón de otros lenguajes de programación).

Si está familiarizado con los ayudantes y componentes de CakePHP, puede verlo así. Un comportamiento es Modelar como Ayudante es Ver como Componente a Controlador. Básicamente es un conjunto de funcionalidades que se usará en múltiples modelos.

Digamos que desea implementar la eliminación suave en todos los modelos de su aplicación. (Borrado suave, no borras el registro, solo lo marcas como eliminado). No querrá poner el mismo código de eliminación suave en cada modelo. ¡Eso no es muy seco! En su lugar, utiliza un comportamiento para abstraer la funcionalidad como tal.

Lo que estamos tratando de hacer es en lugar de eliminar el registro, actualizar la columna eliminada en la fecha actual (funcionará de la misma manera que la creada, modificada). Luego, cambiaremos el método de búsqueda para recuperar solo registros que no se eliminen.

// 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; 
    } 
} 

Luego, en su modelo

Class User extends AppModel { 
    public $actsAs = array('SoftDeletable'); 
} 

Y desde su controlador, puede llamar a cualquiera de nuestros métodos de comportamiento del modelo de

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 
    } 
} 

espero que esto le ayuda.

+0

¡Excelente respuesta! ejemplo de código muy legible y comprensible! gracias. – yossi

+0

De nada, Yossi. ¡Esperaba que no fuera demasiado largo! –

+0

no, fue perfecto ... es por eso ... ¿pueden verificarlo? http://stackoverflow.com/questions/7278357/cakephp-creating-new-user-account-several-problems/7278402#7278402 – yossi

3

comportamientos pueden ser compartidos por los modelos. Normalmente, un comportamiento contiene código abstracto que se puede aplicar a cualquier modelo.

Si bien, por supuesto, podría escribir esto específicamente para un único modelo, tendría que escribirlo nuevamente para otro modelo. Al abstraerlo para que se comparta, ha creado un Comportamiento.

En CakePHP un comportamiento a un modelo es la misma relación que un componentea un controladoro un ayudante a un Ver.

Un ejemplo de un Comportamiento básico en CakePHP es Containable. Esto le permite tener un control más preciso de las relaciones utilizadas en find().

Cuestiones relacionadas