Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Doctrine 2, MVC, Manejadores, Repositorios, Entidades dudas

Estas en el tema de Doctrine 2, MVC, Manejadores, Repositorios, Entidades dudas en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hace ya unos días/semanas que estoy usando doctrine 2 con ayuda de compañeros de este foro, a los cuales estoy muy agradecido, y ahora tengo ...
  #1 (permalink)  
Antiguo 16/04/2012, 12:14
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 10 meses
Puntos: 0
Doctrine 2, MVC, Manejadores, Repositorios, Entidades dudas

Hace ya unos días/semanas que estoy usando doctrine 2 con ayuda de compañeros de este foro, a los cuales estoy muy agradecido, y ahora tengo nuevas dudas y me gustaría exponerlas a ver si podéis ayudarme o darme buenos consejos, como lo hacéis vosotros.
Yo uso manejadores y repositorios. He aquí un ejemplo:

Código PHP:
<?php 
class categoriaManejador
{
    protected 
$_em;
    protected 
$_class;
    
//protected $repository;
     
    
public function __construct(DoctrineORMEntityManager $em$class)
    {
        
$this->_em $em;
        
$this->_class $class;
    }
    public function 
damePrincipales()
    {
        return 
$this->getRepository()->damePrincipales();
    }
    public function 
dameOrdenadoPor( Array $where null, Array $orderby null )
    {
        return 
$this->getRepository()->dameOrdenadoPor$where$orderby );
    }
    public function 
dameUnoPorId$id ){
        return 
$this->getRepository()->dameUnoPorId$id );
    }
    protected function 
getRepository()
    {
        return 
$this->_em->getRepository($this->_class);
    }

    public function 
actualizar( array $datosinteger $id null ) {
        if ( !empty( 
$datos )){
            if ( 
$id === null ){
                
$categoria = new $this->_class;
                
$categoria->setActivotrue );
            }else if ( 
is_int($id) ){
                
$categoria $this->dameUnoPorId$id );
                if ( isset(
$datos['activo']) )  $categoria->setActivo$datos['activo'] );
            }else
                throw new 
MiExcepcion();
        }else
            throw new 
MiExcepcion();
            
        if ( isset(
$datos['categoriapadre']) ){
            
$catePadre $this->dameUnoPorId$datos['categoriapadre'] );
            
$categoria->setCategoriaPadre$catePadre );
        }
        if ( isset(
$datos['nombre']) )          $categoria->setNombre$datos['nombre'] );
        if ( isset(
$datos['urlrelativa']) )     $categoria->setUrlRelativa$datos['urlrelativa'] );
        if ( isset(
$datos['descripcion']) )     $categoria->setDescripcion$datos['descripcion'] );
        if ( isset(
$datos['visible']) )         $categoria->setVisible$datos['visible'] );
        if ( isset(
$datos['urlrelativa']) )     $categoria->setUrlRelativa$datos['urlrelativa'] );
        
$this->_em->persist($categoria);
        
$this->_em->flush();
    }
}
?>
Con el metodo actualizar es con el que hago las inserciones y actualizaciones de registros.
Le paso los datos a actualizar o a introducir en el nuevo registro de la entidad categoria. Si paso $id es que voy a modificar un registro ya existente con los datos pasados en el array $datos y si no paso $id, es que voy a hacer una nueva inserción.
Tengo varias dudas de como implementar este metodo:
1º.- ¿ Esta bien situado aqui en el manejador o deberia implementarlo en el repositorio ? pregunto por llevar un orden.
2º.- ¿ Esta bien enfocada la idea o esta muy feo asi y deberia hacerlo de otra manera ? Tambien podria simplemente pasar un objeto entidad categoria y que simplemente lo actualizara o insertara en vez de pasar los valores e introducirlos. ¿ Como se suele hacer ? ¿ Como lo haceis vosotros ?
3º.- ¿ Como se implementa el filtro de parametros ? Es decir, que el nombre sea pasado como un string, que el id sea pasado como un integer y otros filtros mas especificos que deben cumplir los atributos o campos de nuestras entidades.
¿ Se podria hacer un metodo para filtrar los parametros que me sirva para usarlo en todos los metodos, tanto de insercion, actualizacion como los diferentes metodos de seleccion ?
¿ O deberia de presuponer que el array datos contiene keys correctas y valores correctos ? A fin de cuentas llamare a este metodo desde el controlador.

EDITADO
Otra duda que tengo:
Código PHP:
...
$this->get('manejador_categoria')->actualizar$datosintval($param[0]) );
... 
Esta llamada me produce el siguiente error.
Código:
...
Catchable fatal error: Argument 2 passed to categoriaManejador::actualizar() must be an instance of integer, integer given
...
¿ Que tengo que hacer para definir el tipo del parametro que quiero pasar y que funcione ?
Código PHP:
...
public function 
actualizar( array $datosinteger $id null ) {
... 
¿ O es que en vez de definir en el metodo actualizar que el parametro $id sea "integer" tengo que no ponerle tipo y luego verificar el tipo con is_int en el metodo ?
¿ Como se hace ?


Otra mas:
¿ Como comprobamos despues de una actualizacion o insercion de un registro en una entidad, que se ha llevado a cabo la insercion o la actualizacion satisfactoriamente ?

Última edición por chemajmb; 17/04/2012 a las 11:29
  #2 (permalink)  
Antiguo 18/04/2012, 03:07
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Doctrine 2, MVC, Manejadores, Repositorios, Entidades dudas

1) Depende lo purista que uno sea, si te ajustas rigurosamente al patrón(Repository) debería ir en los repositorios, personalmente utilizo algo similar a lo que tu tienes y solo "bajo" al repositorio cuando el proceso requiere hacer una Query especifica.

2) Puedes tener todas las opciones, simplemente cuando el tipo de dato es una entidad haces el persist directamente.

3) Filtrar y Validar es todo un tema, te sugiero que busques en el foro(se ha tratado anteriormente) o san google, de todas formas te dejo una referencia http://www.doctrine-project.org/blog...lidations.html

Cita:
¿ Que tengo que hacer para definir el tipo del parametro que quiero pasar y que funcione ?
Es una limitación de PHP, Type Hinting.

Cita:
¿ Como comprobamos despues de una actualizacion o insercion de un registro en una entidad, que se ha llevado a cabo la insercion o la actualizacion satisfactoriamente ?
Excepciones, si doctrine no lanza ninguna quiere decir que la transacción fue exitosa.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 18/04/2012 a las 05:14

Etiquetas: class, doctrine, dudas, entidades, mvc, php, repositorios
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 03:23.