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

Empezando con Doctrine 2.2.1

Estas en el tema de Empezando con Doctrine 2.2.1 en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola amigos, Quiero utilizar Doctrine 2.2.1 en mi proyecto, pero por mas que miro tutoriales y tal no me entero. He instalado Doctrine mediante PEAR. ...

  #1 (permalink)  
Antiguo 23/03/2012, 04:52
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Empezando con Doctrine 2.2.1

Hola amigos,

Quiero utilizar Doctrine 2.2.1 en mi proyecto, pero por mas que miro tutoriales y tal no me entero.
He instalado Doctrine mediante PEAR.
Tengo instalado Xampp, y en la carpeta PEAR de PHP, tengo doctrine, dos carpetas DBAL y ORM, pero por mas que miro tutoriales no se empezar.

Tengo la base de datos ya diseñada y me gustaria generar los modelos mediante doctrine para luego modificarlos, añadirles cosas.

Pero es que no se como empezar, ¿ alguien me puede aclarar un poco como empezar ? Por favor, gracias.
  #2 (permalink)  
Antiguo 23/03/2012, 05:11
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Empezando con Doctrine 2.2.1

Reverse engineering no es la mejor para empezar con doctrine, seria mucho mejor desde cero para ir comprendiendo los conceptos, de todas formas lo primero seria configurar correctamente la consola para mapear desde la bbdd http://docs.doctrine-project.org/pro...se-engineering(lee atentamente los notes) y lo otro seria configurar el bootstrap de doctrine http://docs.doctrine-project.org/pro...#bootstrapping, que tienes hecho ?, estas utilizando algún fw ?

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 23/03/2012, 05:56
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Empezando con Doctrine 2.2.1

No, estoy utilizando mi propio mini framework MVC, capturo la peticion url, y lanzo el controlador->metodo( parametros ). Por ejemplo: miweb.com/productos/insertar/ llamaria al controlador productosControlador al metodo insertar. Si no pongo controlador o metodo, carga el controlador / metodo por defecto. Asi que todos los controladores tienen un metodo por defecto "inicio".

Vamos a ver si me aclaro,
Código:
<?php
// test.php

require '/path/to/libraries/Doctrine/Common/ClassLoader.php';
$classLoader = new \Doctrine\Common\ClassLoader('Doctrine', '/path/to/libraries');
$classLoader->register(); // register on SPL autoload stack
¿ Este codigo es para que doctrine cargue sus propias clases para su funcionamiento ?
Es que yo en la carpeta xampp/php/pear/doctrine/ no tengo Common, solo tengo ORM y DBAL.
He leido que ORM incluye Common y DBAL, pero luego busco ClassLoader.php en ORM y no esta.

No se, voy a echar un vistazo a los enlaces que me has puesto y si puedes orientarme o aclararme un poco mas, estaria genial.

Si no entiendo mal, dices que mejor diseñe yo mis modelos para empezar para asimilar algunos conceptos y tener las cosas mas claras. Creo que si, ademas mi proyecto es pequeño, no me costara mucho implementar los modelos yo mismo y asi me ayudara a comprender algunos conceptos y empezar con una buena base.

Gracias por contestar tan pronto.

Última edición por chemajmb; 23/03/2012 a las 06:01
  #4 (permalink)  
Antiguo 23/03/2012, 06:39
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Empezando con Doctrine 2.2.1

El código que muestras es el autoloader para Doctrine, no se como instalaste D2, que comando ejecutaste exactamente ? porque deberías tener en PEAR/Doctrine 3 carpetas, Common, DBAL, ORM, en el directorio de PHP deberias tener los ficheros doctrine, doctrine.php y doctrine.bat, si tienes php en el include_path con ejecutar doctrine en la consola debería ver las opciones del cli.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 23/03/2012, 08:14
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Empezando con Doctrine 2.2.1

Lo instale desde esta web -> http://pear.doctrine-project.org/

Entre en la carpeta xampp/php desde la consola de comandos de windows
y ahi ejecuto los comandos para unirme al canal, listar e instalar paquetes.

Pero en xampp/php/PEAR/Doctrine/ solo tengo instalado DBAL y ORM.

Por cierto, si, en la carpeta xampp/php tengo los 3 archivos doctrine que indicas.

¿ A que te refieres con "si tienes php en el include_path con ejecutar doctrine en la consola debería ver las opciones del cli." exactamente ?
  #6 (permalink)  
Antiguo 23/03/2012, 08:24
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Empezando con Doctrine 2.2.1

Pfff fue un lapsus :P, en realidad lo que quería decir es que si tienes a php en el PATH del sistema deberías poder ejecutar doctrine y ver las opciones de cli.
Intenta instalar Common, con algo asi:

Código CONSOLE:
Ver original
  1. pear install pear.doctrine-project.org/DoctrineCommon-2.2.1

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 23/03/2012, 09:43
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Empezando con Doctrine 2.2.1

Ya esta solucionado, desinstale los dos paquetes que tenia y volvi a instalar Common, DBAL y ORM por este orden y ahora tengo todos.

Ajam, si, tengo php en el path del sistema en windows, desde cualquier directorio puedo ejecutar php en la consola de comandos de windows.

Se esto por que intente añadir pear al path aunque no logre hacerlo finalmente.

Ya tengo la clase classloader.php del paquete Common, ¿ que deberia hacer ahora ?
  #8 (permalink)  
Antiguo 23/03/2012, 10:07
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Empezando con Doctrine 2.2.1

Lo mas sencillo es que siguieras el quickstart http://docs.doctrine-project.org/pro...ick-steps.html y luego deberías meterte con la consola.
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 23/03/2012, 13:57
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Empezando con Doctrine 2.2.1

Ok, ya he definido una entidad de mi proyecto, categorias, con 2 relaciones a si misma. No es el ejemplo mas simple pero tengo que hacerlo, creo que lo he hecho mas o menos bien. Tampoco me he explayado, quiero saber si voy bien y entonces entrar en detalles.

Código PHP:
<?php
use DoctrineCommonCollectionsArrayCollection;

/** 
 * @Entity
 * @Table(name="categorias")
 **/
class Categoria
{
    
/** @Id @GeneratedValue @Column(type="integer") **/
    
protected $id;
    
    
/** @Column(type="integer") **/
    
protected $fkidcategoria;
    
    
/**
     * @ManyToOne(targetEntity="Categoria", inversedBy="categoriashijo" )
     **/
    
protected $categoriapadre;
    
    
/** @OneToMany(targetEntity="Categoria", mappedBy="categoriapadre")
     */
    
protected $categoriashijo;
    
    
/** @Column(type="string") **/
    
protected $nombre;
    
/** @Column(type="string") **/
    
protected $urlrelativa;
    
/** @Column(type="text") **/
    
protected $descripcion;
    
/** @Column(type="boolean") **/
    
protected $visible;
    
/** @Column(type="boolean") **/
    
protected $activo;
    
    public function 
__constructCategoria $categoria null )
    {
        
$this->categoriapadre $categoria;
        
$this->categoriashijo = new ArrayCollection();
    }

    public function 
addCategoriaHijoCategoria $categoria )
    {
        
$this->categoriashijo[] = $categoria;
    }
    
}
Ahora bien, ¿ donde deberia colocar el codigo siguiente o que debo de hacer para poder trabajar con las entidades en mis controladores ?

Código PHP:
<?php

use DoctrineORMToolsSetup;
use 
DoctrineORMEntityManager;

require_once 
'Doctrine/Common/ClassLoader.php';

$loader = new DoctrineCommonClassLoader("Doctrine");
$loader->register();

$dbParams = array(
    
'driver' => 'pdo_mysql',
    
'user' => DB_USER,
    
'password' => DB_PASS,
    
'dbname' => DB_NAME
);
$path = array( DIR_MODELOS );
$config Setup::createAnnotationMetadataConfiguration($pathtrue);
$entityManager EntityManager::create($dbParams$config);

?>
  #10 (permalink)  
Antiguo 23/03/2012, 14:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Empezando con Doctrine 2.2.1

Pues en algún código de inicio o Bootstrap es donde registras en este caso tu dependencia de Doctrine, luego tienes que guardar el $entityManager en algún lado (registro, inyección como dependencia, etc.) y así ya lo usas en tus controladores.

Como dices que usas tu propio FW es complicado que te podamos ayudar más ya que todo depende de como hayas diseñado tu implementación de MVC.

Saludos.
  #11 (permalink)  
Antiguo 23/03/2012, 15:12
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Empezando con Doctrine 2.2.1

Gracias GastorV y masterpuppet una vez mas.
Os explico como es mi miniframework, es sencillito.
Mi archivo index a traves del cual pasan todas las urls de mi aplicacion. Todas las urls son capturadas mediante mod_rewrinting y dirigidas de esta manera: RewriteRule (.*)$ indice.php?enlace=$1 [QSA,L]
Código PHP:
<?php

    ini_set
('display_errors'1);

    
define('DS'DIRECTORY_SEPARATOR);
    
define('ROOT'realpath(dirname(__FILE__)) . DS);
    
define('APP_PATH'ROOT 'application' DS);

    try{
        require_once 
APP_PATH 'Configuracion.php';
        require_once 
APP_PATH 'Peticion.php';
        require_once 
APP_PATH 'Lanzador.php';
        require_once 
APP_PATH 'Controlador.php';
        require_once 
APP_PATH 'Modelo.php';
        require_once 
APP_PATH 'Vista.php';
        require_once 
APP_PATH 'Registro.php';
        require_once 
APP_PATH 'Database.php';
        require_once 
APP_PATH 'Session.php';
        require_once 
APP_PATH 'Hash.php';

        
Session::init();

        
Lanzador::run(new Peticion);
    }catch( 
MiExcepcion $e ){
        
$e->mostrarError();
    }catch(
Exception $e){
        echo 
$e->getMessage();
    }

?>
Mi archivo Peticion.php
Código PHP:
<?php

class Peticion
{
    private 
$_controlador;
    private 
$_accion;
    private 
$_argumentos;
    
    public function 
__construct()
    {
        if( isset(
$_GET['enlace']) ){
            
$enlace filter_input(INPUT_GET'enlace'FILTER_SANITIZE_URL);
            
$enlace explode('/'$enlace);
            
$enlace array_filter($enlace);
            
            
$this->_controlador strtolower(array_shift($enlace));
            
$this->_accion strtolower(array_shift($enlace));
            
$this->_argumentos $enlace;

            if( empty( 
$this->_controlador ) ){
                
$this->_controlador CONTROLADOR_POR_DEFECTO;
            }

            if( empty( 
$this->_accion ) ) {
                
$this->_accion ACCION_POR_DEFECTO;
            }

            if(!isset(
$this->_argumentos)){
                
$this->_argumentos = array();
            }
        }
    }
     
/* metodos get */
}
Mi archivo lanzador que ejecuta el controlador apropiado:
Código PHP:
<?php

class Lanzador
{
    public static function 
run(Peticion $peticion)
    {
        
$controlador $peticion->getControlador() . 'Controlador';
        
$rutaControlador DIR_CONTROLADORES $controlador '.php';
        
$accion $peticion->getAccion();
        
$argumentos $peticion->getArgumentos();

        if( 
is_readable$rutaControlador ) ){
            require_once 
$rutaControlador;
            
$registro = new claseRegistro();

>>>>>>> 
QUIZAS AQUI y pasarselo a los controladores como un parametro opcional <<<<<

            
$controlador = new $controlador($peticion$registro);

            if(
is_callable(array($controlador$accion))){
                if( empty(
$argumentos) == true ){
                    
call_user_func(array($controlador$accion));
                }
                else{
                    
call_user_func_array(array($controlador$accion), array( $argumentos ) ) ;
                }
                exit();
            }
        }
        
header('Location: '.PAGINA_ERROR_404);        
    }
}

?>
Quizas aqui seria un buen lugar para incluir el codigo anterior con un include y poder pasar la clase EntityManager a los controladores, como un tercer parametro opcional.


A ver, que segun voy pensando, yo antes trabajaba con modelos, en los controladores tenia atributos/propiedades donde guardaba una instancia del modelo que iba a utilizar en ese controlador, para hacer las consultas a la base de datos y traerme registro o registros.
Pero ahora ya no voy a tener mas modelos que se conectan individualmente a la base de datos, voy a trabajar con las entidades de doctrine, entonces, simplemente necesito tener el EntityManager disponible en los controladores, y a traves de este, como ya lo he configurado donde tiene que encontrar las clases de las entidades, pues a traves de este ya ¿ puedo utilizar las entidades ? ¿ o como ?

No se si me voy mucho o mas o menos estoy acertado, ¿ es asi ?

Última edición por chemajmb; 23/03/2012 a las 15:51
  #12 (permalink)  
Antiguo 23/03/2012, 15:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Empezando con Doctrine 2.2.1

No, siempre tienes que tener tus modelos y más bien tus modelos tienen que consumir al entityManager para traer los objetos que vas a usar en tus vistas.

Doctrine es un ORM completo, por lo que puedes separar aún mejor tu modelo al regresar objetos (o colecciones de) desde tu modelo.

Lo que tienes que hacer es ver como inyectar desde tu index.php el entityManager a tus modelos para que puedas de ahí cargar repositorios, y obtener tus objetos con los datos ya listos.

Ten en cuenta que toda la capa de Modelo es la lógica de tu negocio, el controlador debe de quedar lo más limpió posible y de ser posible que solamente ocupes la menor cantidad de controladores que cambien la forma de trabajar en base a los diferentes parámetros.

Lee lo siguiente:

http://weblog.jamisbuck.org/2006/10/...ller-fat-model

Saludos.
  #13 (permalink)  
Antiguo 23/03/2012, 16:19
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Empezando con Doctrine 2.2.1

Cita:
Iniciado por GatorV Ver Mensaje
...
Lo que tienes que hacer es ver como inyectar desde tu index.php el entityManager a tus modelos para que puedas de ahí cargar repositorios, y obtener tus objetos con los datos ya listos.
...
ok, entonces yo voy a tener mis modelos que van a tener como tu muy bien has dicho, la logica de mi negocio, que no es mas que los metodos que me van a servir para hacer los requerimientos de mi negocio. En estos metodos y en mis modelos es donde me ayudare de las Entidades de Doctrine. Es por eso que en los modelos necesito tener el EntityManager para poder tener acceso a cualquier entidad, desde cualquier modelo. Que las entidades no es ni mas ni menos que el mapeado de la base de datos.

Creo que no voy mal encaminado, muchisimas gracias por la ayuda. No tengo claro 100% si los modelos y las entidades de doctrine van por separado, creo que si, si me lo podeis aclarar. Cuando digo si van por separado es a si son clases php implementadas por separado.

Si no voy mal encaminado, ahora bien estoy pensando como inyectar el EM desde mi index.php. La cosa es que instancio los controladores en el lanzador.php y cada controlador instancia mediante una funcion "cargaModelo" el/los modelos que necesita. ¿ podria quizas incluir en el index el lanzadorDoctrine, pasarselo a los controladores y que este se lo pase a los modelos en los constructores y que lo guarden como una propiedad ?

¿ o seria mejor hacer un modelo base con un constructor que haga un include del siguiente codigo, y que guarde la referencia del EntityManager en una propiedad de la clase para que asi todos los modelos la tengan ?

LanzadorDoctrine.php
Código PHP:
<?php

use DoctrineORMToolsSetup;
use 
DoctrineORMEntityManager;

require_once 
'Doctrine/Common/ClassLoader.php';

$loader = new DoctrineCommonClassLoader("Doctrine");
$loader->register();

$dbParams = array(
    
'driver' => 'pdo_mysql',
    
'user' => DB_USER,
    
'password' => DB_PASS,
    
'dbname' => DB_NAME
);
$path = array( DIR_ENTIDADES );
$config Setup::createAnnotationMetadataConfiguration($pathtrue);
$entityManager EntityManager::create($dbParams$config);

?>

Última edición por chemajmb; 23/03/2012 a las 16:28
  #14 (permalink)  
Antiguo 23/03/2012, 17:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Empezando con Doctrine 2.2.1

Pues creo que sería una pérdida de performance el cargar todo Doctrine si no lo vas a usar, es mejor que tuvieras una clase que se encargue de levantar el Doctrine, y que esta sea usada por los modelos por necesidad, ya que no todos los modelos van a necesitar Doctrine pero sí muchos van a ocuparlo.

Saludos.
  #15 (permalink)  
Antiguo 23/03/2012, 17:40
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Empezando con Doctrine 2.2.1

Comprueba tu entity, las claves foráneas se mapean a través de las relaciones, osea la propiedad $fkidcategoria no es necesaria y algo que no veo claramente, a que se refieren con relacionar el modelo con el em ?

Y tal cual lo tienes lo mas sencillo seria guardar el em en el registro, luego a traves de este haces el pull cuando lo necesites.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #16 (permalink)  
Antiguo 23/03/2012, 18:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Empezando con Doctrine 2.2.1

A esa misma relación @masterpuppet a hacer que los modelos usen el em cuando lo necesiten
  #17 (permalink)  
Antiguo 23/03/2012, 19:00
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Empezando con Doctrine 2.2.1

Es que esa parte es la que no veo, si se refieren a que una categoría como la que expone chemajmb utilice el em, no me parece lo correcto, es mas creo que debe ser todo lo contrario, no debería saber siquiera de la existencia de un mecanismo de persistencia, ahora si se refieren a un servicio o un mapper que haga uso del em ahi si estaria de acuerdo.

@chemajmb, model y entity son cosas diferentes y deberían ser clases separadas, personalmente lo utilizo de esta forma, el "problema" de esto es que por cada modelo que persiste vas a tener 3 clases, la ganancia, el modelo es completamente libre de la persistencia, igual te sugiero que como estas empezando trabajes directamente con entities para no liarte.

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

Última edición por masterpuppet; 23/03/2012 a las 19:14
  #18 (permalink)  
Antiguo 24/03/2012, 02:41
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Empezando con Doctrine 2.2.1

Cita:
Iniciado por GatorV Ver Mensaje
Pues creo que sería una pérdida de performance el cargar todo Doctrine si no lo vas a usar, es mejor que tuvieras una clase que se encargue de levantar el Doctrine, y que esta sea usada por los modelos por necesidad, ya que no todos los modelos van a necesitar Doctrine pero sí muchos van a ocuparlo.

Saludos.
Ok, entiendo y comparto contigo todo menos la parte de que "no todos los modelos van a necesitar Doctrine".
¿ La clase para levantar Doctrine es esta ?
Código PHP:
<?php

use DoctrineORMToolsSetup;
use 
DoctrineORMEntityManager;

require_once 
'Doctrine/Common/ClassLoader.php';

$loader = new DoctrineCommonClassLoader("Doctrine");
$loader->register();

$dbParams = array(
    
'driver' => 'pdo_mysql',
    
'user' => DB_USER,
    
'password' => DB_PASS,
    
'dbname' => DB_NAME
);
$path = array( DIR_ENTIDADES );
$config Setup::createAnnotationMetadataConfiguration($pathtrue);
$entityManager EntityManager::create($dbParams$config);

?>
¿ o te refieres a otra clase ?

Cita:
Iniciado por masterpuppet Ver Mensaje
Comprueba tu entity, las claves foráneas se mapean a través de las relaciones, osea la propiedad $fkidcategoria no es necesaria y algo que no veo claramente, a que se refieren con relacionar el modelo con el em ?

Y tal cual lo tienes lo mas sencillo seria guardar el em en el registro, luego a traves de este haces el pull cuando lo necesites.

Saludos.
Si si, ;) muy atento pero es que un amigo me dijo que el tenia ambas, aunque pense en preguntarle por que y cuando lo usaba, al final se me olvido hacerlo. Pero el esta trabajando desde hace 6-7 años ya y es un buen consejero. De todas formas se lo preguntare. Ya se que para consultar la fkidcategoria si mapeo la relacion lo haria de la forma $categoriapadre->id en vez de $fkidcategoria, pero el me dijo que usaba ambas y por eso puse la relacion y la clave foranea como tal.

El registro lo utilizo para pasarle los datos a la vista. En el constructor del controlador y de la vista le paso la referencia al registro para que ambos puedan acceder a sus variables. Asi desde el controlador guardo en cualquier momento los datos $this->_regs->titulo y en la vista antes de hacer un include de la plantilla .phtml cargo las variables
Código PHP:
foreach ($this->_regs as $key => $value)
            {
                $
$key $value;
            } 

Cita:
Iniciado por masterpuppet Ver Mensaje
Es que esa parte es la que no veo, si se refieren a que una categoría como la que expone chemajmb utilice el em, no me parece lo correcto, es mas creo que debe ser todo lo contrario, no debería saber siquiera de la existencia de un mecanismo de persistencia, ahora si se refieren a un servicio o un mapper que haga uso del em ahi si estaria de acuerdo.

@chemajmb, model y entity son cosas diferentes y deberían ser clases separadas, personalmente lo utilizo de esta forma, el "problema" de esto es que por cada modelo que persiste vas a tener 3 clases, la ganancia, el modelo es completamente libre de la persistencia, igual te sugiero que como estas empezando trabajes directamente con entities para no liarte.

Saludos.
Quieres decir que en vez de tener 2 o 3 clases por cada entidad de mi proyecto, mejor hacer la logica de negocio, osea el modelo, los metodos que necesito para funcionar, en las entidades propias de doctrine ? para simplificar todo un poco ?

Tengo que marchar, luego vengo le doy un repaso y comento algo si me he dejado sin comentar.
Un saludo

Última edición por chemajmb; 24/03/2012 a las 03:00
  #19 (permalink)  
Antiguo 24/03/2012, 04:48
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Empezando con Doctrine 2.2.1

Cita:
Si si, ;) muy atento pero es que un amigo me dijo que el tenia ambas, aunque pense en preguntarle por que y cuando lo usaba, al final se me olvido hacerlo. Pero el esta trabajando desde hace 6-7 años ya y es un buen consejero. De todas formas se lo preguntare. Ya se que para consultar la fkidcategoria si mapeo la relacion lo haria de la forma $categoriapadre->id en vez de $fkidcategoria, pero el me dijo que usaba ambas y por eso puse la relacion y la clave foranea como tal.
Como si tuviera 12, si prestas atención estas creando una propiedad en tu modelo que no precisas y en tu bbdd duplicando la fk, la razón para esto seguramente sea evitar una query mas a costa de "romper" modelo y bbdd, no lo comparto, la sugerencia de doctrine para estos casos es que crees un método, algo asi:

Código PHP:
Ver original
  1. public function getParentId()
  2. {
  3.     return null === $this->parent ?: $this->parent->getId();
  4. }

Con respecto a tu registro yo pensé que se trataba del patrón Registry, al parecer no es el caso, de todas formas no deberías complicarte mucho, guarda el em en un lugar al cual puedas acceder fácilmente.

Cita:
Quieres decir que en vez de tener 2 o 3 clases por cada entidad de mi proyecto, mejor hacer la logica de negocio, osea el modelo, los metodos que necesito para funcionar, en las entidades propias de doctrine ? para simplificar todo un poco ?
Lo ideal es tenerlo separados, algo asi:

Código PHP:
Ver original
  1. Document
  2.    Post
  3. Entity
  4.    Post
  5. Model
  6.    PostInterface
  7.    Post

como estas empezando te sugiero que modelo = entity(la mayor parte del material que encuentras lo utiliza de esta forma, por simplicidad), algo asi:

Código PHP:
Ver original
  1. Entity
  2.    Post

luego cuando domines d2 ves si quieres/necesitas tal separación.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #20 (permalink)  
Antiguo 26/03/2012, 16:34
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Empezando con Doctrine 2.2.1

Muchas gracias masterpuppet
Cita:
Iniciado por masterpuppet Ver Mensaje
Como si tuviera 12, si prestas atención estas creando una propiedad en tu modelo que no precisas y en tu bbdd duplicando la fk, la razón para esto seguramente sea evitar una query mas a costa de "romper" modelo y bbdd, no lo comparto, la sugerencia de doctrine para estos casos es que crees un método
¿ Pero que pasa que si pones la fk como relacion en la entidad y tambien como dato escalar de la base de datos, en la base de datos necesitas tener 2 campos fk? no puedes de un unico campo de la base de datos sacar 2 propiedades ? Como dices lo de "y en tu bbdd duplicando la fk". De todas formas a mi me gusta hacer las cosas con un minimo de elegancia y sobriedad asi que seguire tu consejo.

Cambiando de tema,
No me importa poner las entidades por un lado y luego los modelos por otro, no me importa separarlos, pero lo que todavia no tengo muy claro es como trabajo con los objetos para trabajar con la base de datos. Es decir, no se como me traigo columnas, 1 registro o varios registros.
Lo primero es mapear las entidades, si, pero ¿ como trabajo con la base de datos ?
¿ lo hago a traves del entitymanager de la forma $post = $entityManager->find("Post", $id); ?
¿ donde "Post" es el nombre de la entidad que quiero usar ?
¿ o esto es otra manera, la manera simple de traerme registros / datos de la db y "Post" se refiere al nombre de la tabla en la base de datos ?
¿ o como se hace ?
Es que no se como se hace exactamente y estoy mirando la ayuda de doctrine y no lo veo.

Gracias, un saludo.

Última edición por chemajmb; 26/03/2012 a las 16:54
  #21 (permalink)  
Antiguo 26/03/2012, 17:20
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Empezando con Doctrine 2.2.1

Tal cual lo tienes chemajmb, se accede a traves de los repositorios, EntityManager::find es un shortcut a EntityManager::getRepository('My\Entity')->find(/***/) y si, Post hace referencia al modelo, esta sección de la doc te va a dar una idea http://docs.doctrine-project.org/pro...h-objects.html, cualquier cosa postea como lo tienes.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #22 (permalink)  
Antiguo 27/03/2012, 01:48
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Empezando con Doctrine 2.2.1

Ok alla voy, pero lo he hecho asi y me da un error

Código:
( ! ) Warning: class_parents() [function.class-parents]: Class categoria does not exist and could not be loaded in C:\xampp\php\PEAR\Doctrine\Common\Persistence\Mapping\RuntimeReflectionService.php on line 40
Call Stack
#	Time	Memory	Function	Location
1	0.0004	334896	{main}( )	..\indice.php:0
2	0.0006	364432	require_once( 'D:\webs\mimascota\indice.php' )	..\indice.php:5
3	0.0203	2567432	Lanzador::run( )	..\indice.php:46
4	0.0537	5892488	call_user_func ( )	..\Lanzador.php:19
5	0.0537	5892488	clientesControlador->prueba( )	..\Lanzador.php:19
6	0.0538	5892680	Doctrine\ORM\EntityManager->find( )	..\clientesControlador.php:22
7	0.0539	5894816	Doctrine\ORM\EntityManager->getRepository( )	..\EntityManager.php:371
8	0.0540	5894872	Doctrine\ORM\EntityManager->getClassMetadata( )	..\EntityManager.php:613
9	0.0540	5894872	Doctrine\ORM\Mapping\ClassMetadataFactory->getMetadataFor( )	..\EntityManager.php:269
10	0.0540	5894904	Doctrine\ORM\Mapping\ClassMetadataFactory->loadMetadata( )	..\ClassMetadataFactory.php:178
11	0.0540	5895088	Doctrine\ORM\Mapping\ClassMetadataFactory->getParentClasses( )	..\ClassMetadataFactory.php:254
12	0.0547	5920048	Doctrine\Common\Persistence\Mapping\RuntimeReflectionService->getParentClasses( )	..\ClassMetadataFactory.php:231
13	0.0547	5920080	class_parents ( )	..\RuntimeReflectionService.php:40

Class categoria does not exist
Aqui la instancia de mi entity manager, para chequear si alguna propiedad tiene un valor que no deberia:
Código:
object(Doctrine\ORM\EntityManager)[19]
  private 'config' => 
    object(Doctrine\ORM\Configuration)[7]
      protected '_attributes' => 
        array
          'metadataCacheImpl' => 
            object(Doctrine\Common\Cache\ArrayCache)[6]
              ...
          'queryCacheImpl' => 
            object(Doctrine\Common\Cache\ArrayCache)[6]
              ...
          'resultCacheImpl' => 
            object(Doctrine\Common\Cache\ArrayCache)[6]
              ...
          'proxyDir' => string 'C:\Windows\TEMP' (length=15)
          'proxyNamespace' => string 'DoctrineProxies' (length=15)
          'autoGenerateProxyClasses' => boolean true
          'metadataDriverImpl' => 
            object(Doctrine\ORM\Mapping\Driver\AnnotationDriver)[13]
              ...
          'classMetadataFactoryName' => string 'Doctrine\ORM\Mapping\ClassMetadataFactory' (length=41)
  private 'conn' => 
    object(Doctrine\DBAL\Connection)[16]
      protected '_conn' => null
      protected '_config' => 
        object(Doctrine\ORM\Configuration)[7]
          protected '_attributes' => 
            array
              ...
      protected '_eventManager' => 
        object(Doctrine\Common\EventManager)[14]
          private '_listeners' => 
            array
              ...
      protected '_expr' => 
        object(Doctrine\DBAL\Query\Expression\ExpressionBuilder)[17]
          private 'connection' => 
            &object(Doctrine\DBAL\Connection)[16]
      private '_isConnected' => boolean false
      private '_transactionNestingLevel' => int 0
      private '_transactionIsolationLevel' => int 2
      private '_nestTransactionsWithSavepoints' => null
      private '_params' => 
        array
          'driver' => string 'pdo_mysql' (length=9)
          'user' => string 'root' (length=4)
          'password' => string 'pass' (length=4)
          'dbname' => string 'mimascota' (length=9)
      protected '_platform' => 
        object(Doctrine\DBAL\Platforms\MySqlPlatform)[18]
          protected 'doctrineTypeMapping' => null
          protected 'doctrineTypeComments' => null
          protected '_eventManager' => 
            object(Doctrine\Common\EventManager)[14]
              ...
      protected '_schemaManager' => null
      protected '_driver' => 
        object(Doctrine\DBAL\Driver\PDOMySql\Driver)[15]
      private '_isRollbackOnly' => boolean false
  private 'metadataFactory' => 
    object(Doctrine\ORM\Mapping\ClassMetadataFactory)[20]
      private 'em' => 
        &object(Doctrine\ORM\EntityManager)[19]
      private 'targetPlatform' => null
      private 'driver' => null
      private 'evm' => null
      private 'cacheDriver' => 
        object(Doctrine\Common\Cache\ArrayCache)[6]
          private 'data' => 
            array
              ...
          private 'namespace' (Doctrine\Common\Cache\CacheProvider) => string 'dc2_9f4a7759cab175745fbf6a53baaf7d9b_' (length=37)
      private 'loadedMetadata' => 
        array
          empty
      private 'initialized' => boolean false
      private 'reflectionService' => null
  private 'repositories' => 
    array
      empty
  private 'unitOfWork' => 
    object(Doctrine\ORM\UnitOfWork)[21]
      private 'identityMap' => 
        array
          empty
      private 'entityIdentifiers' => 
        array
          empty
      private 'originalEntityData' => 
        array
          empty
      private 'entityChangeSets' => 
        array
          empty
      private 'entityStates' => 
        array
          empty
      private 'scheduledForDirtyCheck' => 
        array
          empty
      private 'entityInsertions' => 
        array
          empty
      private 'entityUpdates' => 
        array
          empty
      private 'extraUpdates' => 
        array
          empty
      private 'entityDeletions' => 
        array
          empty
      private 'collectionDeletions' => 
        array
          empty
      private 'collectionUpdates' => 
        array
          empty
      private 'visitedCollections' => 
        array
          empty
      private 'em' => 
        &object(Doctrine\ORM\EntityManager)[19]
      private 'commitOrderCalculator' => null
      private 'persisters' => 
        array
          empty
      private 'collectionPersisters' => 
        array
          empty
      private 'evm' => 
        object(Doctrine\Common\EventManager)[14]
          private '_listeners' => 
            array
              ...
      private 'orphanRemovals' => 
        array
          empty
      private 'readOnlyObjects' => 
        array
          empty
      private 'eagerLoadingEntities' => 
        array
          empty
  private 'eventManager' => 
    object(Doctrine\Common\EventManager)[14]
      private '_listeners' => 
        array
          empty
  private 'hydrators' => 
    array
      empty
  private 'proxyFactory' => 
    object(Doctrine\ORM\Proxy\ProxyFactory)[22]
      private '_em' => 
        &object(Doctrine\ORM\EntityManager)[19]
      private '_autoGenerate' => boolean true
      private '_proxyNamespace' => string 'DoctrineProxies' (length=15)
      private '_proxyDir' => string 'C:\Windows\TEMP' (length=15)
  private 'expressionBuilder' => null
  private 'closed' => boolean false
  private 'filterCollection' => null

Última edición por chemajmb; 27/03/2012 a las 01:54
  #23 (permalink)  
Antiguo 27/03/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, 3 meses
Puntos: 845
Respuesta: Empezando con Doctrine 2.2.1

Es un tema del autoloader, tienes que registrar uno para las entities, algo asi:

Código PHP:
Ver original
  1. $classLoader = new \Doctrine\Common\ClassLoader('Entity', '/path/to/entities');
  2. $classLoader->register();

recuerda agregar el namespace a tus entities.

Código PHP:
Ver original
  1. namespace Entity;
  2.  
  3. use Doctrine\Common\Collections\ArrayCollection;
  4.  
  5. /**
  6.  * @Entity
  7.  * @Table()
  8.  **/
  9. class Category
  10. {...}

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #24 (permalink)  
Antiguo 27/03/2012, 03:28
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Empezando con Doctrine 2.2.1

Deberia dejar el archivo cargador de doctrine asi entonces ?
Código:
<?php

use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

require_once 'Doctrine/Common/ClassLoader.php';

$loader = new \Doctrine\Common\ClassLoader("Doctrine");
$loader->register();

$classLoader = new \Doctrine\Common\ClassLoader('Entity', DIR_ENTIDADES);
$classLoader->register();

$dbParams = array(
    'driver' => 'pdo_mysql',
    'user' => DB_USER,
    'password' => DB_PASS,
    'dbname' => DB_NAME
);
$path = array( DIR_ENTIDADES );
$config = Setup::createAnnotationMetadataConfiguration($path, true);

$em = EntityManager::create($dbParams, $config);

?>
y las entidades asi
Código:
<?php
namespace Entity;

use Doctrine\Common\Collections\ArrayCollection;

/** 
 * @Entity
 * @Table(name="categorias")
 **/
class Categoria
{
...
}
He probado y no me funciona, me sigue dando el mismo eerror, voy a seguir mirando

Última edición por chemajmb; 27/03/2012 a las 05:12
  #25 (permalink)  
Antiguo 27/03/2012, 05:47
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Empezando con Doctrine 2.2.1

Postea el código del find.
__________________
http://es.phptherightway.com/
thats us riders :)
  #26 (permalink)  
Antiguo 27/03/2012, 06:29
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Empezando con Doctrine 2.2.1

He probado en mi controlador de 3 maneras:
( Simplemente estoy probando si funciona, tengo claro que luego tengo que hacer metodos en los modelos para hacer llamadas del tipo $modelo->encuentra($id) en vez de $modelo->_em->find("nombreEntidad", $id ) ).
Código:
public function prueba(){
        $this->_regs->titulo = 'Prueba';
        //$dql = 'SELECT id, nombre FROM Categoria WHERE 1 = 1';
        //$this->_regs->find = $this->_categoria->_em->createQuery($dql)->getResult();
        $this->_regs->find2 = $this->_categoria->_em->find("Categoria", 2);
        //$this->_regs->find = $this->_categoria->_em->getRepository("categoria")->find(array('id'=>2));
        $this->_vista->renderizar('prueba');
    }
_categoria es una propiedad del controlador que es una instancia del modelo que tiene una propiedad _em que es el EntityManager, iniciado en el constructor del modelo.

Constructor del modelo
Código:
    public function __construct()
    {
        require_once DIR_APLICACION_PRINCIPAL . 'DoctrineLanzador.php';
        $this->_em = $em;
    }
Archivo DoctrineLanzador.php
Código:
<?php

use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

require_once 'Doctrine/Common/ClassLoader.php';

$loader = new \Doctrine\Common\ClassLoader("Doctrine");
$loader->register();

$classLoader = new \Doctrine\Common\ClassLoader('Entity', 'D:/webs/mimascota/entidades/');
$classLoader->register();

$dbParams = array(
    'driver' => 'pdo_mysql',
    'user' => DB_USER,
    'password' => DB_PASS,
    'dbname' => DB_NAME
);
$path = array( 'D:/webs/mimascota/entidades/' );
$config = Setup::createAnnotationMetadataConfiguration($path, true);

$em = EntityManager::create($dbParams, $config);

?>
¿ Esta bien hecho asi compañero ? ¿ que me dices ?

Última edición por chemajmb; 27/03/2012 a las 07:07
  #27 (permalink)  
Antiguo 27/03/2012, 07:25
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Empezando con Doctrine 2.2.1

Vamos por partes, el find deberia ser algo asi:

Código PHP:
Ver original
  1. $em->find('Entity\Category', 1);

Ahora con respecto a como lo estas utilizando, parece ActiveRecord, no es la idea en D2 y si bien son pruebas ten en cuenta que el DQL debería ir en los repositorios.

Te dejo un ejemplo de como podría ser, algo así:

DoctrineLanzador.php
Código PHP:
Ver original
  1. ...
  2. $em = EntityManager::create($dbParams, $config);
  3. return $em;

Lanzador.php
Código PHP:
Ver original
  1. ...
  2. require_once $rutaControlador;
  3. $registro = new claseRegistro();
  4. $registro->set('em', include 'DoctrineLanzador.php');
  5. ...

Controller
Código PHP:
Ver original
  1. public function prueba()
  2. {
  3.     $em = $this->_regs->get('em');
  4.     //READ
  5.     $category = $em->find('Entity\Category', 1);
  6.     ....
  7.     $repo       = $em->getRepository('Entity\Category');    
  8.     $categories = $repo->findActiveCategories();
  9.  
  10.     //WRITE
  11.     $category->setName('Custom name');
  12.     $em->persist($category);
  13.     $em->flush();    
  14. }

Custom Repository
Código PHP:
Ver original
  1. namespace Entity\Repository;
  2.  
  3. use Doctrine\ORM\EntityRepository;
  4.  
  5. class CategoryRepository extends EntityRepository
  6. {
  7.      public function getActiveCatgories()
  8.      {...}
  9. }

Category
Código PHP:
Ver original
  1. namespace Entity;
  2.  
  3. use Doctrine\Common\Collections\ArrayCollection;
  4.  
  5. /**
  6.  * @Entity(repositoryClass="Entity\Repository\CategoryRepository")
  7.  * @Table()
  8.  */
  9. class Category
  10. {...}

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #28 (permalink)  
Antiguo 27/03/2012, 10:10
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Empezando con Doctrine 2.2.1

Cita:
Iniciado por masterpuppet Ver Mensaje
Vamos por partes, el find deberia ser algo asi:

Código PHP:
Ver original
  1. $em->find('Entity\Category', 1);

¿ Por que escribes 'Entity\Category' y no 'Category' como nombre de la entidad ? ¿ escribes Entity para indicar el nombre de la carpeta ? ¿ o por que ? Yo las entidades las tengo en la carpeta Entidades, pero si en el inicio del em ya le digo "ruta/de/entidades" no se por que luego tengo que volver a escribir Entity

Ahora con respecto a como lo estas utilizando, parece ActiveRecord, no es la idea en D2 y si bien son pruebas ten en cuenta que el DQL debería ir en los repositorios.

Te dejo un ejemplo de como podría ser, algo así:

DoctrineLanzador.php
Código PHP:
Ver original
  1. ...
  2. $em = EntityManager::create($dbParams, $config);
  3. return $em;

Lanzador.php
Código PHP:
Ver original
  1. ...
  2. require_once $rutaControlador;
  3. $registro = new claseRegistro();
  4. $registro->set('em', include 'DoctrineLanzador.php');
  5. ...

ok, entendido

Controller
Código PHP:
Ver original
  1. public function prueba()
  2. {
  3.     $em = $this->_regs->get('em');
  4.     //READ
  5.     $category = $em->find('Entity\Category', 1);
  6.     ....
  7.     $repo       = $em->getRepository('Entity\Category');    
  8.     $categories = $repo->findActiveCategories();
  9.  
  10.     //WRITE
  11.     $category->setName('Custom name');
  12.     $em->persist($category);
  13.     $em->flush();    
  14. }

Custom Repository
Código PHP:
Ver original
  1. namespace Entity\Repository;
  2.  
  3. use Doctrine\ORM\EntityRepository;
  4.  
  5. class CategoryRepository extends EntityRepository
  6. {
  7.      public function getActiveCatgories()
  8.      {...}
  9. }

Por lo que veo al igual que con las entidades, hay que definir las clases de los repository para trabajar con ellos. ¿ Los repository son asi como una coleccino de entidades ? ¿ o como ?

Category
Código PHP:
Ver original
  1. namespace Entity;
  2.  
  3. use Doctrine\Common\Collections\ArrayCollection;
  4.  
  5. /**
  6.  * @Entity(repositoryClass="Entity\Repository\CategoryRepository")
  7.  * @Table()
  8.  */
  9. class Category
  10. {...}

Saludos.

Última edición por chemajmb; 27/03/2012 a las 10:18
  #29 (permalink)  
Antiguo 27/03/2012, 10:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Empezando con Doctrine 2.2.1

Al hacer:
$em->find('Entity\Category', 1);

Es porque debes de indicar el namespace de la entidad, no la carpeta, si no el namespace donde estén tus entities.

El EntityManager es en sí un repositorio de entidades, pero para mayor control, tu puedes hacer y definir un repositorio propio para en lugar de usar find($entity, $id), puedas definir por ejemplo findRecentEntities($id) o algo por el estilo, el repositorio de entidades es un proxy donde puedes crear métodos más avanzados para extraer entidades (y donde deben de ir tus DQLs para mayor control).

Saludos.
  #30 (permalink)  
Antiguo 29/03/2012, 10:59
 
Fecha de Ingreso: enero-2012
Ubicación: España
Mensajes: 150
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Empezando con Doctrine 2.2.1

Estoy un poco extresado. No logro poder usar doctrine correctamente.
Al final voy a tener que implementarlo a la antigua usanza.

Tengo una funcion para la carga de doctrine, del entitymanager
Código PHP:
<?php
    
use DoctrineORMToolsSetup;
    use 
DoctrineORMEntityManager;

    function 
DoctrineLanzador(){
    
        require_once 
'Doctrine/Common/ClassLoader.php';
        
$loader = new DoctrineCommonClassLoader("Doctrine");
        
$loader->register();
        
        
$classLoader = new DoctrineCommonClassLoader('Entity'DIR_ENTIDADES );
        
$classLoader->register();
        
        
$dbParams = array(
            
'driver' => 'pdo_mysql',
            
'user' => DB_USER,
            
'password' => DB_PASS,
            
'dbname' => DB_NAME
        
);
        
$path = array( DIR_ENTIDADES );
        
$config Setup::createAnnotationMetadataConfiguration($pathtrue);
        
        
$em EntityManager::create($dbParams$config);
        return 
$em;

    }

?>
Guardo el EntityManager en mis modelos:
Código PHP:
require_once DIR_APLICACION_PRINCIPAL 'DoctrineLanzador.php';

class 
claseModeloDoctrine{

    public 
$_em;

    public function 
__construct($dicc )
    {
        
$this->_em DoctrineLanzador();
    }
...

Mis modelos extienden esta clase:
Código PHP:
class categoriaMod extends claseModeloDoctrine{
    
    function 
__construct(){
        
parent::__construct$dicc );
    }

Tengo la entidad definida:
Código PHP:
<?php
namespace Entity
;

use 
DoctrineCommonCollectionsArrayCollection;

/** 
 * @Entity
 * @Table(name="categorias")
 **/
class Categoria
{
    
/** @Id @GeneratedValue @Column(type="integer") **/
    
protected $id;

    
/** @ManyToOne(targetEntity="Categoria", inversedBy="categoriashijo" ) **/
    
protected $categoriapadre;
    
    
/** @OneToMany(targetEntity="Categoria", mappedBy="categoriapadre") **/
    
protected $categoriashijo;
    
    
/** @Column(type="string") **/
    
protected $nombre;
    
/** @Column(type="string") **/
    
protected $urlrelativa;
    
/** @Column(type="text") **/
    
protected $descripcion;
    
/** @Column(type="boolean") **/
    
protected $visible;
    
/** @Column(type="boolean") **/
    
protected $activo;
    
    public function 
__constructCategoria $categoria null )
    {
        
$this->categoriapadre $categoria;
        
$this->categoriashijo = new ArrayCollection();
    }

    public function 
addCategoriaHijoCategoria $categoria )
    {
        
$this->categoriashijo[] = $categoria;
    }
    
}
?>
En el controlador intento usar el EntityManager trayendome una categoria con id = 2 pero nada.
Código PHP:
$this->_categoria $this->cargaModelo('categoria'); // instancia el modelo
$this->_vista->find $this->_categoria->_em->find("Categoria"2); 
Pero me salta el siguiente error

Código:
Warning: require(D:\webs\mimascota\entidades\Entity\Categoria.php) [function.require]: failed to open stream: No such file or directory in C:\xampp\php\PEAR\Doctrine\Common\ClassLoader.php on line 163
Call Stack
#	Time	Memory	Function	Location
1	0.0002	334896	{main}( )	..\indice.php:0
2	0.0006	363576	require_once( 'D:\webs\mimascota\indice.php' )	..\indice.php:5
3	0.0277	2559576	Lanzador::run( )	..\indice.php:46
4	0.0645	5884352	call_user_func ( )	..\Lanzador.php:19
5	0.0645	5884352	clientesControlador->prueba( )	..\Lanzador.php:19
6	0.0645	5884552	Doctrine\ORM\EntityManager->find( )	..\clientesControlador.php:22
7	0.0647	5886688	Doctrine\ORM\EntityManager->getRepository( )	..\EntityManager.php:371
8	0.0647	5886752	Doctrine\ORM\EntityManager->getClassMetadata( )	..\EntityManager.php:613
9	0.0647	5886752	Doctrine\ORM\Mapping\ClassMetadataFactory->getMetadataFor( )	..\EntityManager.php:269
10	0.0648	5886784	Doctrine\ORM\Mapping\ClassMetadataFactory->loadMetadata( )	..\ClassMetadataFactory.php:178
11	0.0648	5886968	Doctrine\ORM\Mapping\ClassMetadataFactory->getParentClasses( )	..\ClassMetadataFactory.php:254
12	0.0655	5911928	Doctrine\Common\Persistence\Mapping\RuntimeReflectionService->getParentClasses( )	..\ClassMetadataFactory.php:231
13	0.0655	5911960	class_parents ( )	..\RuntimeReflectionService.php:40
14	0.0655	5912200	Doctrine\Common\ClassLoader->loadClass( )	..\ClassLoader.php:0

( ! ) Fatal error: require() [function.require]: Failed opening required 'D:\webs\mimascota\entidades\Entity\Categoria.php' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\php\PEAR\Doctrine\Common\ClassLoader.php on line 163
Call Stack
#	Time	Memory	Function	Location
1	0.0002	334896	{main}( )	..\indice.php:0
2	0.0006	363576	require_once( 'D:\webs\mimascota\indice.php' )	..\indice.php:5
3	0.0277	2559576	Lanzador::run( )	..\indice.php:46
4	0.0645	5884352	call_user_func ( )	..\Lanzador.php:19
5	0.0645	5884352	clientesControlador->prueba( )	..\Lanzador.php:19
6	0.0645	5884552	Doctrine\ORM\EntityManager->find( )	..\clientesControlador.php:22
7	0.0647	5886688	Doctrine\ORM\EntityManager->getRepository( )	..\EntityManager.php:371
8	0.0647	5886752	Doctrine\ORM\EntityManager->getClassMetadata( )	..\EntityManager.php:613
9	0.0647	5886752	Doctrine\ORM\Mapping\ClassMetadataFactory->getMetadataFor( )	..\EntityManager.php:269
10	0.0648	5886784	Doctrine\ORM\Mapping\ClassMetadataFactory->loadMetadata( )	..\ClassMetadataFactory.php:178
11	0.0648	5886968	Doctrine\ORM\Mapping\ClassMetadataFactory->getParentClasses( )	..\ClassMetadataFactory.php:254
12	0.0655	5911928	Doctrine\Common\Persistence\Mapping\RuntimeReflectionService->getParentClasses( )	..\ClassMetadataFactory.php:231
13	0.0655	5911960	class_parents ( )	..\RuntimeReflectionService.php:40
14	0.0655	5912200	Doctrine\Common\ClassLoader->loadClass( )	..\ClassLoader.php:0
Necesito ayuda amigos QQ

EDITADO:
Por fin parece que ya me funciona. Que alibio!

Última edición por chemajmb; 29/03/2012 a las 12:01

Etiquetas: doctrine, empezando, php
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 00:27.