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();
    }
}
?>    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]) );
... 
    
Código:
  
¿ Que tengo que hacer para definir el tipo del parametro que quiero pasar y que funcione ?... Catchable fatal error: Argument 2 passed to categoriaManejador::actualizar() must be an instance of integer, integer given ...
Código PHP:
   ...
public function actualizar( array $datos, integer $id = null ) {
... 
    ¿ 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 ?
 

