CodeIgniter 2.2 and Doctrine 2

3

I have installed CI2, Doctrine 2 and HMVC. I followed the steps in this site . by removing Smarty that I did not find necessary.

My folders are organized as follows:

->application

  ->cache
    ->doctrine
      ->generated_entities
      ->proxies

  ->core
    ->MY_Loader.php
    ->MY_Router.php
    ->MY_Controller.php

  ->libraries
    ->Doctrine.php

  ->models
    ->doctrine
      ->entities
        ->usuario.php
        ->grupo.php

  ->third_party
    ->Doctrine
      ->bin
      ->Doctrine
        ->Common
        ->DBAL
        ->ORM
        ->Symfony

  ->...

My autoload.php file I entered the doctrine:

$autoload['libraries'] = array('session', 'bcrypt', 'doctrine');

In the Doctrine file of the library folder I have this code:

<?php (defined('BASEPATH')) OR exit('No direct script access allowed');
use Doctrine\Common\ClassLoader,
    Doctrine\ORM\EntityManager,
    Doctrine\ORM\Configuration,
    Doctrine\ORM,
    Doctrine\Common\Cache\ArrayCache,
    Doctrine\DBAL\Logging\EchoSQLLogger,
    Doctrine\ORM\Mapping\Driver\DatabaseDriver,
    Doctrine\ORM\Tools\DisconnectedClassMetadataFactory,
    Doctrine\ORM\Tools\EntityGenerator,
    Doctrine\OXM;

define('DEBUGGING', false);
/**
 * Doctrine
 *
 * @category Libraries
 * @package  CodeIgniter
 * @author   Tariqul Islam <[email protected]>
 * @license  http://directory.fsf.org/wiki/License:ReciprocalPLv1.3 Reciprocal Public License v1.3
 * @link     http://webkutir.net
 */

class Doctrine
{
    public $em = null;
    /**
     * Class Constructor
     */
    public function __construct()
    {
        // load database configuration and custom config from CodeIgniter
        include APPPATH . 'config/database.php';
        // Set up class loading.
        include_once APPPATH . 'third_party/Doctrine/Doctrine/Common/ClassLoader.php';
        $doctrineClassLoader = new \Doctrine\Common\ClassLoader('Doctrine', APPPATH . 'third_party/Doctrine');
        $doctrineClassLoader->register();
        $entitiesClassLoader = new \Doctrine\Common\ClassLoader('entities', APPPATH . 'models/doctrine');
        $entitiesClassLoader->register();
        $proxiesClassLoader = new \Doctrine\Common\ClassLoader('proxies', APPPATH . 'cache/doctrine');
        $proxiesClassLoader->register();
        $symfonyClassLoader = new \Doctrine\Common\ClassLoader('Symfony', APPPATH . 'third_party/Doctrine/Doctrine');
        $symfonyClassLoader->register();
        // Choose caching method based on application mode (ENVIRONMENT is defined in /index.php)
        if (ENVIRONMENT == 'development' || ENVIRONMENT == 'testing') {
            $cache = new \Doctrine\Common\Cache\ArrayCache;
        } else {
            $cache = new \Doctrine\Common\Cache\ApcCache;
        }
        // Set some configuration options
        $config = new Configuration;
        // Metadata driver
        $driverImpl = $config->newDefaultAnnotationDriver(APPPATH . 'models/doctrine/entities');
        $config->setMetadataDriverImpl($driverImpl);
        // Caching
        $config->setMetadataCacheImpl($cache);
        $config->setQueryCacheImpl($cache);
        // Proxies
        $config->setProxyDir(APPPATH . 'cache/doctrine/proxies');
        $config->setProxyNamespace('Proxies');
        if (ENVIRONMENT == 'development') {
            $config->setAutoGenerateProxyClasses(true);
        } else {
            $config->setAutoGenerateProxyClasses(false);
        }
        // SQL query logger
        if (DEBUGGING) {
            $logger = new \Doctrine\DBAL\Logging\EchoSQLLogger;
            $config->setSQLLogger($logger);
        }
        // Database connection information
        if (ENVIRONMENT == 'testing') {
            $active_group = 'default_test';
        }
        $connectionOptions = array(
            'driver'   => 'pdo_mysql',
            'user'     => $db[$active_group]['username'],
            'password' => $db[$active_group]['password'],
            'host'     => $db[$active_group]['hostname'],
            'dbname'   => $db[$active_group]['database']
        );
        // Create EntityManager
        $this->em = EntityManager::create($connectionOptions, $config);
        //Classe para criar o banco
        //$this->generate_classes();
    }

    /**
    * generate entity objects automatically from mysql db tables
    * @return none
    */
    function generate_classes(){
        $this->em->getConfiguration()
            ->setMetadataDriverImpl(
                new DatabaseDriver(
                $this->em->getConnection()->getSchemaManager()
            )
        );
        $cmf = new DisconnectedClassMetadataFactory();
        $cmf->setEntityManager($this->em);
        $metadata = $cmf->getAllMetadata();     
        $generator = new EntityGenerator();
        $generator->setUpdateEntityIfExists(true);
        $generator->setGenerateStubMethods(true);
        $generator->setGenerateAnnotations(true);
        $generator->generate($metadata, APPPATH."models/doctrine/entities");
    }
}

/* End of file Doctrine.php */
/* Location: ./application/libraries/Doctrine.php */

As I'm using HMVC, in the core folder, in application, I've created three file, which follows:

MY_Loader.php

<?php (defined('BASEPATH')) OR exit('No direct script access allowed');

/* load the MX_Loader class */
require APPPATH."third_party/MX/Loader.php";

class MY_Loader extends MX_Loader {}

MY_Router.php

<?php (defined('BASEPATH')) OR exit('No direct script access allowed');

/* load the MX_Router class */
require APPPATH."third_party/MX/Router.php";

class MY_Router extends MX_Router {}

MY_Controller

<?php (defined('BASEPATH')) OR exit('No direct script access allowed');
/**
 * MY_Controller
 *
 * @category MY_Controller
 * @package  CodeIgniter
 * @author   Tariqul Islam <[email protected]>
 * @license  http://directory.fsf.org/wiki/License:ReciprocalPLv1.3 Reciprocal Public License v1.3
 * @link     http://webkutir.net
 */
class MY_Controller extends MX_Controller
{
    public $em;
    /**
     * Constructor of MY Controller
     */
    function __construct()
    {
        parent::__construct();
        $this->em=$this->doctrine->em;
    }
}

/* End of file MY_Controller.php */
/* Location: ./application/core/MY_Controller.php */

The user.php and grupo.php files inside the entities folder follow:

user.php

<?php

/**
 * Usuario
 *
 * @Table(name="usuario")
 * @Entity
 */
class Usuario
{
    /**
    * @Id @Column(type="integer")
    * @GeneratedValue(strategy="IDENTITY")
    */
    public $id = 0;
    /**
    * @var string
    * @Column(name="nome", type="string", length=50, nullable=true)
    */
    public $nome = '';
    /**
    * @var string
    * @Column(name="login", type="string", length=20, nullable=true)
    */
    public $login = '';
    /**
    * @var string
    * @Column(name="senha", type="string", length=300, nullable=true)
    */
    public $senha = '';
    /**
    * @var boolean
    * @Column(name="ativo", type="boolean", nullable=true, options={"default":0})
    */
    public $ativo = 0;
    /**
    * @var string
    * @Column(name="email", type="string", length=200, nullable=true)
    */
    public $email = '';
    /**
    * @var string
    * @Column(name="fone_primeiro", type="string", length=14, nullable=true)
    */
    public $fone_primeiro = '';
    /**
    * @var string
    * @Column(name="fone_segundo", type="string", length=14, nullable=true)
    */
    public $fone_segundo = '';
    /**
    * @var string
    * @Column(name="esqueci_senha_cod", type="string", length=40, nullable=true)
    */
    public $esqueci_senha_cod = '';
    /**
    * @var DateTime
    * @Column(name="ultimo_acesso", type="datetime", nullable=true)
    */
    public $ultimo_acesso = '';
    /**
    * @var boolean
    * @Column(name="online", type="boolean", nullable=true, options={"default":0})
    */
    public $online = 0;
    /**
    * @var string
    * @Column(name="usuario_cad", type="string", length=15, nullable=true)
    */
    public $usuario_cad = '';
    /**
    * @var string
    * @Column(name="usuario_alt", type="string", length=15, nullable=true)
    */
    public $usuario_alt = '';
    /**
    * @var DateTime
    * @Column(name="dt_entrada", type="datetime", nullable=true)
    */
    public $dt_entrada = '';
    /**
    * @var DateTime
    * @Column(name="dt_saida", type="datetime", nullable=true)
    */
    public $dt_saida = '';
    /**
    * @var Grupo
    *
    * @ManyToOne(targetEntity="Grupo")
    * @JoinColumn(name="grupo_id", referencedColumnName="id")
    */
    public $grupo;
    /**
    * Constructor
    */
    public function __construct()
    {
        $this->ultimo_acesso = new \DateTime("now");
        $this->dt_entrada = new \DateTime("now");
        $this->dt_saida = new \DateTime("now");
    }
}
/* End of file usuario.php */
/* Location: ./application/model/usuario.php */

grupo.php

<?php

/**
 * Grupo
 *
 * @Table(name="grupo")
 * @Entity
 */
class Grupo
{
    /**
    * @Id @Column(type="integer")
    * @GeneratedValue(strategy="IDENTITY")
    */
    public $id = 0;
    /**
    * @var string
    * @Column(name="nome", type="string", length=10, nullable=false)
    */
    public $nome = '';
    /**
    * @var string
    * @Column(name="apelido", type="string", length=20, nullable=false)
    */
    public $apelido = '';
    /**
    * @var boolean
    * @Column(name="ativo", type="boolean", nullable=false, options={"default":0})
    */
    public $ativo = 0;
    /**
    * @var string
    * @Column(name="usuario_cad", type="string", length=15, nullable=false)
    */
    public $usuario_cad = '';
    /**
    * @var string
    * @Column(name="usuario_alt", type="string", length=15, nullable=false)
    */
    public $usuario_alt = '';
    /**
    * @var DateTime
    * @Column(name="dt_cad", type="datetime", nullable=false)
    */
    public $dt_cad = '';
    /**
    * @var DateTime
    * @Column(name="dt_alt", type="datetime", nullable=false)
    */
    public $dt_alt = '';
    /**
    * metodo construtor
    **/
    public function __construct()
    {
        $this->dt_cad = new \DateTime("now");
        $this->dt_alt = new \DateTime("now");
    }
}
/* End of file grupo.php */
/* Location: ./application/model/doctrine/entities/grupo.php */

Below is my controller with the code that creates the tables in the database:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Teste2 extends MY_Controller {

    private $st;
    private $cmf;

    function __construct()
    {
        //Chama o modelo construtor
       parent::__construct();

        $this->st = new \Doctrine\ORM\Tools\SchemaTool($this->doctrine->em);
        $this->cmf = $this->doctrine->em->getMetadataFactory();
    }

    public function index()
    {
        try {
            //$this->st->createSchema($this->cmf->getAllMetadata());
            $saveMode=false;
            $this->st->updateSchema($this->cmf->getAllMetadata(), $saveMode);
        } catch(Exception $ex) {

        }
    }
}

/* End of file teste2.php */
/* Location: ./application/controllers/teste2.php */

So, for example, in a controller I create the users:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Teste extends MY_Controller {

    function __construct()
    {
        //Chama o modelo construtor
       parent::__construct();
    }

    public function index()
    {
        //======== CAD GRUPO
        $this->load->model('doctrine/entities/grupo', 'grupo');
        $this->grupo->nome = 'user';
        $this->grupo->apelido = 'Usuário';
        $this->grupo->ativo = 1;
        $this->grupo->usuario_cad = 'user';
        $this->grupo->usuario_alt = 'user';

        $this->doctrine->em->persist($this->grupo);

        //======= CAD USUARIO
        $this->load->model('doctrine/entities/usuario', 'usuario');

        $this->usuario->nome = 'wagner';
        $this->usuario->login = 'wagner';
        $this->usuario->senha = 'wagner';
        $this->usuario->ativo = 1;
        $this->usuario->grupo = $this->grupo;

        $this->doctrine->em->persist($this->usuario);

        $this->doctrine->em->flush();
    }
}

/* End of file teste.php */
/* Location: ./application/controllers/teste.php */

And in another file I try to query this user, but that's where the problem rolls.

If I simply search, it returns an error like this: 500 - Internal Server Error. Follow the file:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Login extends MY_Controller {

    function __construct()
    {
        // Call the Model constructor
        parent::__construct();
    }

    function index()
    {
        $this->load->model('doctrine/entities/usuario', 'usuario');
        $usuario = $this->em->getRepository("usuario")->find(1);
        var_dump($usuario->login);
    }

}

/* End of file login.php */
/* Location: ./application/controllers/login.php */

As a beginner in Doctrine, I started messing around here and added some code in the example above and it worked. But why? What's wrong with my Code? Here's the new code:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Login extends MY_Controller {

private $st;
private $cmf;

    function __construct()
    {
        // Call the Model constructor
        parent::__construct();

        $this->st = new \Doctrine\ORM\Tools\SchemaTool($this->doctrine->em);
        $this->cmf = $this->doctrine->em->getMetadataFactory();
    }

    function index()
    {
        try {
            $saveMode=false;
            $this->st->updateSchema($this->cmf->getAllMetadata(), $saveMode);
        } catch(Exception $ex) {

        }

        $this->load->model('doctrine/entities/usuario', 'usuario');
        $usuario = $this->em->getRepository("usuario")->find(1);
        var_dump($usuario->login);
    }

}

/* End of file login.php */
/* Location: ./application/controllers/login.php */

So if possible tell me what I'm doing wrong.

Another interesting thing I noticed, is that in these codes I posted, I'm using ManytoOne Unidirectional. So if I do a simple search on an entity that has no relationship, the code works without using that schema.

So, I do not know anything else !! rsrsr

From now on I thank and apologize if it is something easy, but since I do not have much knowledge of Doctrine and I have searched Google extensively and found nothing, I thought to ask.

Thank you.

    
asked by anonymous 22.05.2015 / 16:29

0 answers