elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Laravel - Clase Model, sobrecargar métodos principales
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Laravel - Clase Model, sobrecargar métodos principales  (Leído 3,447 veces)
fran800m

Desconectado Desconectado

Mensajes: 204



Ver Perfil
Laravel - Clase Model, sobrecargar métodos principales
« 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.


En línea

ThinkByYourself

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Laravel - Clase Model, sobrecargar métodos principales
« Respuesta #1 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
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

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!


« Última modificación: 3 Enero 2017, 18:34 pm por NoBullshit » En línea

No te voy a engañar.
Todos hemos sido programados para normalizar la psicopatía de las élites económicas y políticas, y para realimentar su patrón de ciega codicia.
fran800m

Desconectado Desconectado

Mensajes: 204



Ver Perfil
Re: Laravel - Clase Model, sobrecargar métodos principales
« Respuesta #2 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,

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines