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

CI 2 Y Doctrine 2 Problema EntityRepository

Estas en el tema de CI 2 Y Doctrine 2 Problema EntityRepository en el foro de CodeIgniter en Foros del Web. Hola, estoy comenzando con Codeigniter y Doctrine y me tope con mi primer problema, he podido hacer la integración bien de eso estoy seguro ya ...
  #1 (permalink)  
Antiguo 08/11/2011, 15:34
 
Fecha de Ingreso: febrero-2007
Mensajes: 58
Antigüedad: 17 años, 2 meses
Puntos: 1
CI 2 Y Doctrine 2 Problema EntityRepository

Hola, estoy comenzando con Codeigniter y Doctrine y me tope con mi primer problema, he podido hacer la integración bien de eso estoy seguro ya que gracias a los comando de doctrine cree el esquema de la base de datos, me genero los getters and setters y me creo el archivo UserRepository que ahi es donde viene mi problema, al querer utilizar los métodos de esa Clase, o simplemente cargar el repositorio.



Error:
Fatal error: Uncaught exception 'Doctrine\ORM\Mapping\MappingException' with message 'Class models\repositories\UserRepository is not a valid entity or mapped super class.' in ..\htdocs\DoCI\application\libraries\Doctrine\ORM\ Mapping\MappingException.php:142 Stack trace: #0 htdocs\DoCI\application\libraries\Doctrine\ORM\Map ping\Driver\AnnotationDriver.php(148): Doctrine\ORM\Mapping\MappingException::classIsNotA ValidEntityOrMappedSuperClass('models\reposito...' ) #1 ..\htdocs\DoCI\application\libraries\Doctrine\ORM\ Mapping\ClassMetadataFactory.php(281): Doctrine\ORM\Mapping\Driver\AnnotationDriver->loadMetadataForClass('models\reposito...', Object(Doctrine\ORM\Mapping\ClassMetadata)) #2 ..\htdocs\DoCI\application\libraries\Doctrine\ORM\ Mapping\ClassMetadataFactory.php(170): Doctrine\ORM\Mapping\ClassMetadataFactory->loadMetadata('models\reposito...') #3 ..\htdocs\DoCI\application\libraries\Doctrine\ORM\ EntityManager.php(257): Doctrine\ORM\Mapping\ClassMetadataFactory->getMetadataFor('models\ in ..\htdocs\DoCI\application\libraries\Doctrine\ORM\ Mapping\MappingException.php on line 142

Bueno comentare como tengo mi estructura en mi proyecto:

(Caperta-->models)
--> (Capeta-->repositories)
--> UserRepository.php (models-->repositories-->UserRepository )
--> User.php (models-->User )

La Clase User
(models-->User.php)
Código PHP:
namespace models;

use 
DoctrineCommonCollectionsArrayCollection;

/**
 * @Entity
 * @Table(name="usuarios")
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="tipo_usuario", type="string")
 * @DiscriminatorMap({"user" = "User", "ROLE_CLIENTE" = "Cliente"})
 * @entity(repositoryClass="models\repositories\UserRepository")
 */
class User
{
   

    
/**
     * @Id
     * @Column(type="integer", nullable=false)
     * @GeneratedValue(strategy="AUTO")
     */
    
protected $id;

    
/**
     * @Column(type="string", length=32, nullable=false)
     */
    
protected $username;

    
/**
     * @Column(type="string", length=64, nullable=false)
     */
    
protected $password;

    
/**
     * @Column(type="string", length=255, nullable=false)
     */
    
protected $email;



como se ve luego hay una clase Cliente la cual extiende a User, le quite los getters and setter para que quede mas limpio, pero en mi archivo estan.

La Clase UserRepository
(models-->reposotories->UserRepository.php)
Código PHP:
<?php
namespace modelsrepositories
;
use 
DoctrineORMEntityRepository;

class 
UserRepository extends EntityRepository {
        
    function 
validate(){
        
        
$em $this->getEntityManager();
        
$em->createQuery('SELECT u FROM models\User u WHERE u.username = "Cliente"')->getResult();
        
    }
}
?>
Un metodo simple para probar si funcionan.

Dentro de mi controlador, esta es una de las tantas maneras que he intentado llamar al repositorio
Código PHP:
         $em $this->doctrine->em;
        
$user $em->getRepository('models\repositories\UserRepository')
                           ->
validate(); 
Mi doctrine.php (Las dos lineas comentadas, debajo de la que dicen 'Symfony' es una de las soluciones que intente)
Código PHP:
<?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 \Doctrine\Common\ClassLoader('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);
    }
}
  #2 (permalink)  
Antiguo 08/11/2011, 18:06
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: CI 2 Y Doctrine 2 Problema EntityRepository

en Doctrine2 el repositorio es llamado desde la Entidad:

$em->getRepository('models\\user')
->validate();

con ello cargará el repositorio desde la definición del metadato de la entidad
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 08/11/2011, 18:41
 
Fecha de Ingreso: febrero-2007
Mensajes: 58
Antigüedad: 17 años, 2 meses
Puntos: 1
Mensaje Respuesta: CI 2 Y Doctrine 2 Problema EntityRepository

Gracias por la repuesta, la verdad que no sabia eso y en todos lados lo vi de la otra manera.

tambien he agregado lo siguiente al .htaccess

php_flag eaccelerator.enable 0
php_flag eaccelerator.optimizer 0

Pero la solucion fue la tuya
Código PHP:
   $em $this->doctrine->em;
   
$user $em->getRepository('models\User')->validate(); 
y en el metodo validate cambie las comillas porque sino me daba error (Una rapida prueba e imprimio todo OK)

Código PHP:
function validate(){
        echo 
"Entro al metodo";
        
$em $this->getEntityManager();
        
$users $em->createQuery("SELECT u FROM models\User u WHERE u.email = '[email protected]'")
                         ->
getResult();
                         
        if (
$users){
            foreach(
$users as $user){
                echo 
"Usuario: "$user->getUsername();
            }
        }else{
            echo 
"retorno nada";
        }
        
        
        
        
    } 
Muchas gracias maycolalvarez!!!

Saludos.

Etiquetas: Ninguno
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 18:05.