Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: fran800m en 30 Diciembre 2016, 16:03 pm



Título: Laravel - Clase Model, sobrecargar métodos principales
Publicado por: fran800m en 30 Diciembre 2016, 16:03 pm
La idea es la siguiente:

Hay un campo de una tabla que va comprimido como BLOB.

Quiero que la compresión / descompresión sea transparente para quien use la clase, que no tenga que andar haciendo:

Código:
$objModel->campo = gzencode($objModel->campo);
$objModel->campo = gzdecode($objModel->campo);

Para ello he decidido sobrecargar métodos en la clase que hereda de Model.
Para la grabación ya lo he logrado, sobrecargando el método save, de manera:

Código:
public function save($attributes[] = null)
{
$this->campo = gzencode($objModel->campo);
return parent::save($attributes);
}

Pero para la obtención de datos de la BD y realizar la descompresión "transparente" he probado a sobrecargar boot(), __call, __callstatic, etc y nada.

¿Alguien sabría qué método es el que instancia y "rellena" las propiedades de la clase, para poder hacer a continuación el gzdecode?

Si veis algún fallo perdonadme, he escrito el código de memoria.


Título: Re: Laravel - Clase Model, sobrecargar métodos principales
Publicado por: ThinkByYourself en 3 Enero 2017, 18:26 pm
Hola!

Para una clase en PHP plano están los denominados "métodos mágicos" de __get y __set:

https://stackoverflow.com/questions/4713680/php-get-and-set-magic-methods (https://stackoverflow.com/questions/4713680/php-get-and-set-magic-methods)
http://nl.php.net/__get (http://nl.php.net/__get)

Peeero parece ser que Laravel ya juega con ellos. Y deja al programador jugar con lo que denomina "Accessors" (para el __get) y "Mutators" (para el __set):

https://laravel.com/docs/5.3/eloquent-mutators (https://laravel.com/docs/5.3/eloquent-mutators)

Creo que funcionaría así para el caso que indicas (suponiendo que tu clase modelo se llamase ClassModel):

Código
  1. class ClassModel extends Model {
  2.  
  3.    public function setCampoAttribute($value)
  4.    {
  5.        return gzencode($value);
  6.    }
  7.  
  8.    public function getCampoAttribute($value)
  9.    {
  10.        return gzdecode($value);
  11.    }
  12.  
  13. }

Esto vale para la versión 5.3 de Laravel, que no sé si es la que estás usando.

No lo he probado, todo hay que decirlo, sólo imagino que será algo así.

Saludos!


Título: Re: Laravel - Clase Model, sobrecargar métodos principales
Publicado por: fran800m en 9 Enero 2017, 00:03 am
Gracias NoBullshit, estoy "poniendo los cuernos" al foro con stackoverflow y acabo de leerte. Eso sí, allí no me hablaron de los métodos mágicos __get y __set  ;-)

Acertaste con los Accessors y Mutators, ya va todo fino, y precisamente es con Laravel 5.3 con lo que estoy liado, te lo comento por si alguna vez te hace falta y puedo estaré encantado de echarte un cable  ;)

Un saludo,