Foros del Web » Programando para Internet » PHP » Symfony »

Como hacer un ViewModel

Estas en el tema de Como hacer un ViewModel en el foro de Symfony en Foros del Web. Como puedo hacer en symfony lo que en otros lenguajes se llaman ViewModels? Me explico : tengo una entidad usuario que tiene un monton de ...
  #1 (permalink)  
Antiguo 11/03/2016, 02:58
 
Fecha de Ingreso: noviembre-2015
Mensajes: 20
Antigüedad: 8 años, 5 meses
Puntos: 1
Como hacer un ViewModel

Como puedo hacer en symfony lo que en otros lenguajes se llaman ViewModels?
Me explico :

tengo una entidad usuario que tiene un monton de campos,ademas de esos también tengo un campo que almacena la ruta de una imagen ligada a ese usuario,pero no voy a guardar esa ruta en la base de datos porque se genera sin problemas desde el codigo,ya que es la misma siempre y solo cambia una carpeta que coincide con el nombre del usuario.

para ello tengo la entidad de usuario,y una clase que hereda de esa entidad con ese campo añadido,campo "logo".

como hago para que cuando instancie una clase de la entidad hija,me cargue la entidad padre con todos sus datos?.

Ahora lo tengo asi,pero el problema es que se crea una clase dentro de la hija que contiene a la padre y yo solo quiero una clase hija con todos los datos de la padre en ella y no que tenga a su padre contenida.No se si se me entiende,jjjjjjj.

Código PHP:
Ver original
  1. class UsuarioViewModel extends Usuario {
  2.  
  3.     private $logo;
  4.     public $UserOriginal;
  5.  
  6.     public function __construct($userOriginal)
  7.     //public function __construct()
  8.     {
  9.         parent::__construct();
  10.         $this->UserOriginal = $userOriginal;
  11.     }
  12.  
  13.     public function setLogo($logo) {
  14.         $this->logo = $logo;
  15.  
  16.         return $this;
  17.     }
  18.  
  19.     public function getLogo() {
  20.         return $this->logo;
  21.     }
  22.  
  23. }

Código PHP:
Ver original
  1. class Usuario extends BaseUser {
  2.  
  3.     //para las relaciones muchos a muchos
  4.     public function __construct()
  5.     {
  6.         parent::__construct();
  7.        
  8.         $this->sectoresEmpresa = new ArrayCollection();
  9.         $this->tiposCli = new ArrayCollection();
  10.     }
  11.  
  12.     /**
  13.      * @ORM\Column(type="integer")
  14.      * @ORM\Id
  15.      * @ORM\GeneratedValue(strategy="AUTO")
  16.      **/
  17.     protected $id;
  18.    
  19.     /**
  20.      * @ORM\Column(type="boolean", nullable=false)
  21.      */
  22.     protected $esEmpresa = false;
  23.  
  24. ...
  25. ...
  26. ...
  #2 (permalink)  
Antiguo 11/03/2016, 03:21
 
Fecha de Ingreso: noviembre-2015
Mensajes: 20
Antigüedad: 8 años, 5 meses
Puntos: 1
Respuesta: Como hacer un ViewModel

Si yo hago :

$usuario = new UsuarioViewModel($usuarioOriginal);
$usuario->setLogo($rutaLogo);
$esEmpresa = $usuario->getEsEmpresa();

este getEsEmpresa(),o cualquier get que haga,siempre devuelve vacio.

¿como hago para que al hacer el new,el $usuario tenga accesibles los datos de $usuarioOriginal?
  #3 (permalink)  
Antiguo 11/03/2016, 13:24
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Como hacer un ViewModel

No existe algo como ViewModel en symfony, seria mejor si nos dices que es lo que quieres hacer realmente con eso que estas publicando
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #4 (permalink)  
Antiguo 14/03/2016, 03:43
 
Fecha de Ingreso: noviembre-2015
Mensajes: 20
Antigüedad: 8 años, 5 meses
Puntos: 1
Respuesta: Como hacer un ViewModel

Cita:
Iniciado por hhs Ver Mensaje
No existe algo como ViewModel en symfony, seria mejor si nos dices que es lo que quieres hacer realmente con eso que estas publicando
El usuario tiene asociado un logo en una ruta y quiero pasar a la vista una clase con todos los datos de esa entidad usuario,mas la ruta de ese logo (esta ruta es generada desde el controlador),que sera el "src" de una etiqueta <img>,y asi con mas datos que nunca van a ser persistidos,es para no andar pasando variables sueltas a la vista y tenerlo todo organizado dentro de una clase.


Gracias

Última edición por polaries; 14/03/2016 a las 03:55
  #5 (permalink)  
Antiguo 14/03/2016, 11:02
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Como hacer un ViewModel

creo que lo que necesitas implementar es un Presenter, y quiero suponer que en la entidad Usuario ya tienes un método que recupera la imagen del logo y solo necesitas la ruta donde esta almacenada esa imagen.
Te dejo esto como ejemplo sencillo.

Presenter
Código PHP:
Ver original
  1. /**
  2.  * Class AbstractPresenter
  3.  */
  4. abstract class AbstractPresenter
  5. {
  6.     protected $entity;
  7.  
  8.     public function __construct($entity)
  9.     {
  10.         $this->entity = $entity;
  11.     }
  12.  
  13.     public function __call($methodName, $arguments)
  14.     {
  15.         $methods = get_class_methods($this->entity);
  16.  
  17.         if (in_array($methodName, $methods)) {
  18.             return call_user_func_array(array($this->entity, $methodName), $arguments);
  19.         } else {
  20.             throw new \Exception("No such method " . $methodName);
  21.         }
  22.     }
  23. }
User Presenter
Código PHP:
Ver original
  1. /**
  2.  * Class UserPresenter
  3.  */
  4. class UserPresenter extends AbstractPresenter
  5. {
  6.     private $path = 'path/to/image';
  7.  
  8.     public function getLogo()
  9.     {
  10.         return $this->getPath().DIRECTORY_SEPARATOR.$this->getImage();
  11.     }
  12.  
  13.     private function getPath()
  14.     {
  15.         return $this->path;
  16.     }
  17. }
método del controlador
Código PHP:
Ver original
  1. /**
  2.      * Method Controller
  3.      *
  4.      * @return array
  5.      */
  6.     public function showAction()
  7.     {
  8.  
  9.         $user = $this->getDoctrine()->getRepository('AppBundle:User')->find($id);
  10.  
  11.         return array(
  12.             'entity' => new UserPresenter($user),
  13.         );
  14.     }

vista
Código PHP:
Ver original
  1. {{entity.logo}}
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Última edición por hhs; 14/03/2016 a las 13:37
  #6 (permalink)  
Antiguo 15/03/2016, 04:06
 
Fecha de Ingreso: noviembre-2015
Mensajes: 20
Antigüedad: 8 años, 5 meses
Puntos: 1
Respuesta: Como hacer un ViewModel

Exacto,eso es lo que quería,muchas gracias,ahora a ver si lo doy hecho,jjjjjjj.

Última edición por polaries; 15/03/2016 a las 06:10
  #7 (permalink)  
Antiguo 15/03/2016, 13:06
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Como hacer un ViewModel

suerte con eso colega
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #8 (permalink)  
Antiguo 24/03/2017, 03:10
 
Fecha de Ingreso: noviembre-2015
Mensajes: 20
Antigüedad: 8 años, 5 meses
Puntos: 1
Respuesta: Como hacer un ViewModel

Buenas,estoy en un nuevo proyecto y he decidido usar los presenters,ya que en el otro (donde pedi la información de como se hacía) fabriqué una solución por mi cuenta antes de ver la respuesta del compañero hhs,y luego como me funcionaba bien ya no me puse a rehacerlo.
Este nuevo proyecto ya lo tengo funcionando con presenters y tengo que decir que me gustan bastante,es justo lo que necesitaba y me hubiera ahorrao unas horas de trabajo en el anterior proyecto de haber sabido antes como se hacía.
Pongo esto porque no he visto mucha información en google acerca de los presenters,ni tampoco en los manuales,(por eso no los conocía)....y no se necesita nada mas que las lineas de arriba del compañero hhs para comprenderlos y hacerlos funcionar...incluiría esas lineas en el manual oficial y una explicación (quizá no haya sabido buscar y si que se explique en los manuales oficiales)....de hecho,incluiría este post,ya que esto es muy util y sencillo (hasta yo he sabido hacerlo)....jojojojoj.....gracias de nuevo.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:27.