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

codeigniter y doctrine2, como llamar a un método de los modelos?

Estas en el tema de codeigniter y doctrine2, como llamar a un método de los modelos? en el foro de CodeIgniter en Foros del Web. hola, estoy intentando trabajar con codeigniter2 y doctrine2 y la verdad esque tengo una complicacion un poco tonta. no se como llamar desde los controladores ...
  #1 (permalink)  
Antiguo 13/11/2011, 12:09
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
codeigniter y doctrine2, como llamar a un método de los modelos?

hola, estoy intentando trabajar con codeigniter2 y doctrine2 y la verdad esque tengo una complicacion un poco tonta. no se como llamar desde los controladores a un método de un model definido con doctrine2.

Ademas de esto mi aplicacion lo estoy trabajando en hmvc, asi separo mi aplicacion por módulos., entonces yo tengo un modulo llamado blog. que es una carpeta dentro de application/modules/blog/ y dentro de esta una carpeta para controladores, modelos y vistas.

Esto corre muy bien. El único problema es que no se como llamar al método lo intente de la siguiente manera:

controlador blog.php
Código PHP:
Ver original
  1. class Blog extends MX_Controller
  2. {
  3.     function __construct()
  4.     {
  5.          parent::__construct();
  6.         $this->load->library('doctrine');
  7.         $this->em = $this->doctrine->em;      
  8.     }
  9.     /**
  10.      * Método Principal de blog que nos permitira a travez de una grilla
  11.      * gestionar el blog
  12.      */
  13.     function index()
  14.     {  
  15.         $this->load->library('doctrine');
  16.         //$cat = new models/categorias;
  17.         $rs =$this->em->getRepository('blog\models\categorias')
  18.                             ->getAll(1);
  19.         echo $rs;
  20.         //$rs =
  21.         //$this->load->view('vGrillaBlog');
  22.     }
  23. }
En $rs =$this->em->getRepository('blog\models\categorias') ->getAll(1);
Segun se doctrine dos llama repositorios a las tablas entonces por eso pongo getRepository y si ese es el repositorio, entonces acceder an método pense que seria con getAll(), porque defini ese método pero me sale el siguiente error:
Código PHP:
Ver original
  1. Fatal error: Uncaught exception 'BadMethodCallException' with message 'Undefined method 'getAll'. The method name must start with either findBy or findOneBy!' in /var/www/cms/trunk/eagle/application/third_party/doctrine-orm/Doctrine/ORM/EntityRepository.php:186 Stack trace: #0 /var/www/cms/trunk/eagle/application/modules/blog/controllers/blog.php(28): Doctrine\ORM\EntityRepository->__call('getAll', Array) #1 /var/www/cms/trunk/eagle/application/modules/blog/controllers/blog.php(28): Doctrine\ORM\EntityRepository->getAll(1) #2 [internal function]: Blog->index() #3 /var/www/cms/trunk/eagle/system/core/CodeIgniter.php(339): call_user_func_array(Array, Array) #4 /var/www/cms/trunk/eagle/index.php(163): require_once('/var/www/cms/tr...') #5 {main} thrown in /var/www/cms/trunk/eagle/application/third_party/doctrine-orm/Doctrine/ORM/EntityRepository.php on line 186
__________________
Dejando una huella de mi existencia por la red en http://tiricaya.com
  #2 (permalink)  
Antiguo 14/11/2011, 07:17
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: codeigniter y doctrine2, como llamar a un método de los modelos?

estás llamando a $this->load->library('doctrine'); nuevamente en la fuinción, si lo llamas desde el constructor no hace falta

Los repositorios son clases externas al modelo, que heredan de EntityRepository, y su función es encapsular tu lógica del negocio, mientras que las clases de Entidades encapsulan la lógica del modelo a nivel de Registro.

EntityRepository dispone de los métodos básicos como find, findAll, findByOne, entre otros, pero para crear los tuyos propios has de establecer un repositorio para cada Entidad:

@Entity(repositoryClass="mi_ruta_hacia_repositorio \MiClaseRepository")

y con ello, en la clase generada si utilizas el comando por consola:

./doctrine orm:generate-repositories ''

te generará los repositorios de las clases indicadas y es allí donde definirás tu método getAll, la misma clase te provee acceso al em con $this->_em

lo ideal es tener los repositorios o en el mismo directorio de los modelos, o en uno dentro de ellos, si están afuera necesitas definir un autoload para su namespace especifico
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 14/11/2011, 10:15
Avatar de Copia  
Fecha de Ingreso: noviembre-2009
Mensajes: 309
Antigüedad: 14 años, 5 meses
Puntos: 4
Respuesta: codeigniter y doctrine2, como llamar a un método de los modelos?

Gracias Maycolelvares, perdon no me habia fijado de la doble llamada a la libreria.
QUiero ver si entendi, Si yo hago una clase digamos Categoria, sin extender a otra clase esa seria mi clase para la lógica del modelo a nivel registro? o sea la propia definicion de la tabla?.

Y para poder trabajar con esa tabla tendria que crear otra clase, digamos OperacionesCategoria extends EntityRepository donde defina los método particulares que necesito de esa tabla?... ya me puse a pensar como lo aria con tablas relacionadas. :S vaya a cambiado mucho este doctrine.

Gracias.
__________________
Dejando una huella de mi existencia por la red en http://tiricaya.com
  #4 (permalink)  
Antiguo 14/11/2011, 10:28
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: codeigniter y doctrine2, como llamar a un método de los modelos?

primero debes definir el repositoryClass:

@Entity(repositoryClass="mi_ruta_hacia_repositorio \MiClaseRepository")

luego por consola se te genera la clase:

./doctrine orm:generate-repositories ''

y de hecho lo que cambió en Doctrine2 fue el nombre a "Repositorio", porque el mismo concepto se aplicaba en Doctrine 1.x, donde existían 2 clases por entidad (Mitabla.php que extendía de Doctrine_Record y MitablaTable.php que extendía de Doctrine_Table) e incluso en Propel: donde tenias MiTabla y MiTablaPeer

en definitiva, las clases de Repositorio son el contenedor ideal para la lógica del modelo, porque en ella se realizan los queryes para grupos de registros, en cambio en la Entidad solo aplica para el registro como tal, en donde defino getters y setters especiales según mi lógica de negocio
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...

Última edición por maycolalvarez; 14/11/2011 a las 10:34

Etiquetas: doctrine2, 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 21:53.