Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/04/2012, 12:14
chemajmb
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 3 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