Foros del Web » Programando para Internet » PHP » CodeIgniter »

Doctrine no me trae objeto

Estas en el tema de Doctrine no me trae objeto en el foro de CodeIgniter en Foros del Web. Hola amigos soy nuevo en Doctrine y estoy realizando una aplicación y no puedo recuperar un objeto que tiene relacion con varios otros, la relacion ...
  #1 (permalink)  
Antiguo 06/12/2011, 19:16
 
Fecha de Ingreso: febrero-2007
Mensajes: 58
Antigüedad: 17 años, 1 mes
Puntos: 1
Doctrine no me trae objeto

Hola amigos soy nuevo en Doctrine y estoy realizando una aplicación y no puedo recuperar un objeto que tiene relacion con varios otros, la relacion seria algo asi.
La Clase Cliente extiende la Clase User, les comento las relaciones

Un cliente tiente una lista y una lista tiene mucho productos, vista del otro lado un producto pertenece a varias listas y una lista podira perteneces a muchos clientes

Cliente >-- Lista >--< Producto

Estoy utilizando Codeigniter entonces mis clases estan dentro de la carpeta models y dentro de la misma tento la carpeta repositorioes.
Carpetas
models (Carpeta)
----repositories (Carpeta que contiene los archivos que se indican en la doc de cada clase)
----User.php
----Cliente.php
----Lista.php
----Producto.php

La base de datos la cree con el comando de Doctrine por lo tanto me lo toma bien a las relaciones, tambien he podido realizar inserciones pero al momento de realizar la consulta $cliente->getLista() ya me produce error.

lo que me retorna al queres llamar al metodo:

A PHP Error was encountered

Severity: Warning

Message: file_put_contents(application/models/Proxies/modelsListaProxy.php): failed to open stream: No such file or directory

Filename: Proxy/ProxyFactory.php

Line Number: 155

A PHP Error was encountered
-----------------------------------------------------------------------------------------------
Severity: Warning

Message: require(application/models/Proxies/modelsListaProxy.php): failed to open stream: No such file or directory

Filename: Proxy/ProxyFactory.php

Line Number: 85

--------------------------------------------------------------------------------------------

Les muestro lo interezante de mis clases que son las relaciones
ACALRACION ME QUITO ALGUNAS BARRAS DE LAS CLASES en realidad es: use \Doctrine\Common\Collections\ArrayCollection;
Clase Cliente
Código PHP:
namespace models;
use 
DoctrineCommonCollectionsArrayCollection;
/**
 * @Entity
 * @entity(repositoryClass="models\repositories\ClienteRepository")
 */
class Cliente extends User
{
    
/** 
     * @ManyToOne(targetEntity="Lista") 
     * @JoinColumn(name="lista_id", referencedColumnName="id" ) 
     */  
    
protected $mi_lista;

    public function 
getLista() {
        return 
$this->mi_lista;
    }

    public function 
setLista($lista) {
        
$this->mi_lista $lista;
    }

Clase Lista
Código PHP:
namespace models;
use 
DoctrineCommonCollectionsArrayCollection;
/**
 * @Entity
 * @Table(name="listas")
 * @entity(repositoryClass="models\repositories\ListaRepository")
*/
class Lista {
 
/** 
     * @OneToMany(targetEntity="Cliente", mappedBy="mi_lista") 
     */  
    
protected $clientes;
    
    
/**
     * @ManyToMany(targetEntity="Producto", inversedBy="listas")
     * @JoinTable(name="listas_productos",
     *      joinColumns={@JoinColumn(name="lista_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="producto_id", referencedColumnName="id")}
     * )
     */
    
protected $productos;

public function 
getClientes() {
        return 
$this->clientes;
    }

    public function 
setClientes($clientes) {
        
$this->clientes $clientes;
    }

    public function 
getProductos() {
        return 
$this->productos;
    }

    public function 
setProductos($productos) {
        
$this->productos $productos;
    }

Clase Producto
Código PHP:
namespace models;
use 
DoctrineCommonCollectionsArrayCollection;
/**
 * @Entity
 * @Table(name="productos")
 * @entity(repositoryClass="models\repositories\ProductoRepository")
 */
class Producto {
   
/**
    * @ManyToMany(targetEntity="Lista", mappedBy="productos")
    */
    
protected $listas;
public function 
getListas() {
        return 
$this->listas;
    }

    public function 
setListas($listas) {
        
$this->listas $listas;
    }

Espero que se entienda el problema cualquier ayuda sera muy bienvenida.

Saludos y gracias por leer el post.

Nico.
  #2 (permalink)  
Antiguo 07/12/2011, 08:12
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Doctrine no me trae objeto

1 - el parser de Doctrine2 tiene un 80% de efectividad, revisa si realmente te creo un modelo que funcione

2 - no existen las clases Proxy (en D2 se usan para el lazy loading), generalmente en Desarrollo se recomienda usar un auto-generado de proxys, cuando pases a producción debes de generar las clases proxy al menos una vez, como tal debes de tener el siguiente código en tu Clase constructora del EntityManager, así yo la tengo integrada con CI2:

Código PHP:
Ver original
  1. // Para integrar con CodeIgniter 2, construyendo el EntityManager
  2.     // Establece los Proxys
  3.     $doctrine_config->setProxyDir(APPPATH . 'Entity/Proxies'); //CAMBIE el directorio según donde tenga los modelos, puede ser models/Proxies
  4.     $doctrine_config->setProxyNamespace('Proxies');
  5.    
  6.     // Establece el modo de generación de Proxys según el entorno de la aplicación
  7.     if (ENVIRONMENT == 'development') {
  8.       $doctrine_config->setAutoGenerateProxyClasses(TRUE);
  9.     } else {
  10.       $doctrine_config->setAutoGenerateProxyClasses(FALSE);
  11.     }

3 - debes de darle permisos de escritura al directorio de los proxies, cuando pases a producción y los crees (o tengas listos) puedes remover el permiso de escritura.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 07/12/2011, 10:09
 
Fecha de Ingreso: febrero-2007
Mensajes: 58
Antigüedad: 17 años, 1 mes
Puntos: 1
Respuesta: Doctrine no me trae objeto

Muchas gracias por responder maycoalvarez te comento que lo he realizado asi

Código PHP:
$proxiesClassLoader = new DoctrineCommonClassLoader('Proxies'APPPATH 'models');
$proxiesClassLoader->register();

$entityClassLoader = new DoctrineCommonClassLoader('repositories'APPPATH.'models');
$entityClassLoader->register();

if (
ENVIRONMENT == 'development') {
   
$config->setAutoGenerateProxyClasses(TRUE);
} else {
   
$config->setAutoGenerateProxyClasses(FALSE);

Aqui dejo el archivo completo, pero la verdad que la integración la he descargado de una pagina y se que varios la están usando por eso no creo que sea la integracion en si el problema, la verdad que no tengo mucho conocimiento pero creo que el problema viene porque cliente extiende de user y también hay otras clases que entienden de user como Administrador. Y en la tabla usuario (Que contiene Administrador y Clientes) hay varios campos en NULL, pero como dije solo es una intuición soy muy novato en Doctrine

La integracion la descargue de este sitio:
http://wildlyinaccurate.com/integrat...codeigniter-2/
Código PHP:
use DoctrineORMEntityManager,
    
DoctrineORMConfiguration;

define('DEBUGGING'FALSE);

class 
Doctrine {

    public 
$em null;

    public function 
__construct()
    {
        
// load database configuration and custom config from CodeIgniter
        
require APPPATH 'config/database.php';

        
// Set up class loading.
        
require_once APPPATH 'libraries/Doctrine/Common/ClassLoader.php';

        
$doctrineClassLoader = new DoctrineCommonClassLoader('Doctrine'APPPATH 'libraries');
        
$doctrineClassLoader->register();

        
$entitiesClassLoader = new DoctrineCommonClassLoader('models'rtrim(APPPATH'/'));
        
$entitiesClassLoader->register();

        
$proxiesClassLoader = new DoctrineCommonClassLoader('Proxies'APPPATH 'models');
        
$proxiesClassLoader->register();

        
$symfonyClassLoader = new DoctrineCommonClassLoader('Symfony'APPPATH 'libraries/Doctrine');
        
$symfonyClassLoader->register();
                
                
$entityClassLoader = new DoctrineCommonClassLoader('repositories'APPPATH.'models');
                
$entityClassLoader->register();

        
// Choose caching method based on application mode
        
if (ENVIRONMENT == 'production')
        {
            
$cache = new DoctrineCommonCacheApcCache;
        }
        else
        {
            
$cache = new DoctrineCommonCacheArrayCache;
        }

        
// Set some configuration options
        
$config = new Configuration;

        
// Metadata driver
        
$driverImpl $config->newDefaultAnnotationDriver(APPPATH 'models');    
        
$config->setMetadataDriverImpl($driverImpl);

        
// Caching
        
$config->setMetadataCacheImpl($cache);
        
$config->setQueryCacheImpl($cache);

        
// Proxies
        
$config->setProxyDir(APPPATH 'models/Proxies');
        
$config->setProxyNamespace('Proxies');

        if (
ENVIRONMENT == 'development') {
            
$config->setAutoGenerateProxyClasses(TRUE);
        } else {
            
$config->setAutoGenerateProxyClasses(FALSE);
        }

        
// SQL query logger
        
if (DEBUGGING)
        {
            
$logger = new DoctrineDBALLoggingEchoSQLLogger;
            
$config->setSQLLogger($logger);
        }

        
// Database connection information
        
$connectionOptions = array(
            
'driver' => 'pdo_mysql',
            
'user' => $db['default']['username'],
            
'password' => $db['default']['password'],
            
'host' => $db['default']['hostname'],
            
'dbname' => $db['default']['database']
        );

        
// Create EntityManager
        
$this->em EntityManager::create($connectionOptions$config);
    }

Cualquier dato o ayuda sera muy bienvenida.

Saludos.

Nico.
  #4 (permalink)  
Antiguo 07/12/2011, 10:12
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Doctrine no me trae objeto

de todas formas el error proviene de que el directorio de proxys no tiene permisos, asignarlos.

por otro lado, no he tocado la parte de herencia de D2, pero creo que es muy importante definir los DiscriminatorColumns para tales entidades, consulta la Documentación de Doctrine, saludos
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #5 (permalink)  
Antiguo 07/12/2011, 10:18
 
Fecha de Ingreso: febrero-2007
Mensajes: 58
Antigüedad: 17 años, 1 mes
Puntos: 1
Respuesta: Doctrine no me trae objeto

Perdon por mi ignorancia pero no se los estoy asignado con esta linea?

$proxiesClassLoader = new DoctrineCommonClassLoader('Proxies', APPPATH . 'models');
$proxiesClassLoader->register();

LA herencia esta bien realizada ya que antes de agregar estas nuevas relaciones he interactuado con los diferentes usuarios Cliente y Administrador realizando ABML con ellos.

Saludos y gracias de nuevo.

Nico.
  #6 (permalink)  
Antiguo 07/12/2011, 10:23
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Doctrine no me trae objeto

allí lo que defines es el autoload, pero el error te indica dos cosas:

o no consigue los proxys

o no puede escribir los proxys el autogenerador de proxys

es allí en donde debes concentrarte.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #7 (permalink)  
Antiguo 07/12/2011, 10:27
 
Fecha de Ingreso: febrero-2007
Mensajes: 58
Antigüedad: 17 años, 1 mes
Puntos: 1
Respuesta: Doctrine no me trae objeto

Pero estoy viendo que se los asigna, lo que no entiendo bien es a que llamas modelos yo lo que tengo son las clases con las anotaciones y los repositorios donde realizo alguno metodos.... pero no tengo ninguna carpeta Proxies... gracias por darme la direccion del problema.
Código PHP:
    $config = new Configuration;
    
// Proxies
    
$config->setProxyDir(APPPATH 'models/Proxies');
    
$config->setProxyNamespace('Proxies'); 
Gracias y saludos.

Nico.

Última edición por nico8287; 07/12/2011 a las 10:41
  #8 (permalink)  
Antiguo 07/12/2011, 12:08
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Doctrine no me trae objeto

Modelos corresponde a tu Modelo de negocio como se le conoce bajo la arquitectura MVC, y son tus Entidades de doctrine.

Debes de crear la carpeta Proxies de lo contrario no podrá generar los mismos, y darle permisos de escritura
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #9 (permalink)  
Antiguo 07/12/2011, 12:47
 
Fecha de Ingreso: febrero-2007
Mensajes: 58
Antigüedad: 17 años, 1 mes
Puntos: 1
Respuesta: Doctrine no me trae objeto

Me conecte para dejar la respuesta y ya respondiste tu, lo que realice es agregar la carpeta como bien dices y dar los permisos, y solo me genero modelsClaseProxy... muchas gracias.

Muchas gracias y Saludos.

Nico.
  #10 (permalink)  
Antiguo 07/12/2011, 12:52
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: Doctrine no me trae objeto

ok, perfecto que lo solucionaras, saludos y éxito
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...

Etiquetas: clase, doctrine, objeto, 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 04:11.