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 $datos, integer $id = null ) {
if ( !empty( $datos )){
if ( $id === null ){
$categoria = new $this->_class;
$categoria->setActivo( true );
}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( $datos, intval($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 $datos, integer $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 ?