En Cakephp, ¿puedo usar afterSave() en el modelo para realizar tareas adicionales dependiendo de lo que se acaba de guardar?

Tengo dos modelos: Dibujo tiene muchos Paneles y Paneles pertenece a Dibujo. Cada vez que se guarda un panel, me gustaría verificar si es el tercer panel que se agregará a un Dibujo. Si es así, me gustaría fusionar los tres paneles en un nuevo archivo png y guardar el nombre de archivo y la ruta del png en la tabla de dibujo.

class Drawing extends AppModel {
  public $name = 'Drawing';
  public $hasMany = array(
    'Panel' => array(
        'className' => 'Panel',
        'dependent' => true,
        'fields' => array('id', 'filepath', 'filename', 'placement')
        )
  );
}

class Panel extends AppModel {
  public $name = 'Panel';
  public $belongsTo = array(
    'Drawing'=>array(
        'className'=>'Drawing',
        'foreignKey'=>'drawing_id',
        'counterCache' => true
        )
    );
}

Dado que configuré counterCache en verdadero en el modelo Panel, realizo un seguimiento de los paneles con panel_count en mi tabla de dibujos, y puedo verificar cuándo hay 3 paneles. Creo que la mejor manera sería usar una devolución de llamada afterSave(). De esa manera, puedo verificar si ahora hay tres paneles y, si los hay, puedo actualizar lo que quiera. (Mi controlador evita que el usuario agregue nuevos paneles una vez que hay tres). Sin embargo, no creo que el siguiente código funcione: detiene el funcionamiento de otras partes de mi aplicación y si elimino la función afterSave(), todo vuelve a funcionar. ¿Cómo puedo verificar panel_count desde mi modelo de dibujo? ¿Hay una mejor manera de hacer esto?

// Inside of the Drawing model... 
public function afterSave($created){
  if ($this->data[panel_count] == 3){
    // create a new image by merging the three panel images together
    // add the filename and path of the new image to the database
  }
}

preguntado el 12 de junio de 12 a las 14:06

¿Has echado un vistazo a los registros de errores? -

No es un cheque costoso de hacer, así que ejecutarlo afterSave es justificable para mi. Estaría agregando la línea: parent::afterSave($created); de modo que afterSaves hasta la cadena de herencia aún se ejecutará. Esto puede estar rompiendo su aplicación. Además, es fácil crear bucles infinitos en afterSaves: su error puede ser que PHP alcance su límite de recurrencia. -

1 Respuestas

Cree un nuevo método de modelo para hacer la funcionalidad y guarde con ese método desde el controlador. La razón de esto es el cambio en la propiedad Drawing.panel_count (tiene que actualizar el registro del dibujo y esto crea un bucle afterSave).

Por lo general, evito las devoluciones de llamada para cualquier manipulación de datos (especialmente dentro del mismo modelo), ya que se ejecutan cada vez y, a veces, simplemente quiero GUARDAR sin la manipulación adicional. También es mucho más fácil mover una pieza de código de un método a una devolución de llamada afterSave más tarde que al revés.

Respondido el 27 de enero de 13 a las 10:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.