Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

vieira.rrafael

[Resolvido] Configurar Doctrine 2.x

Recommended Posts

<!--

I have a dream... e neste sonho eu consigo criar um EntityManager.
Comecei a ler o manual do doctrine 2.0 e não saí do capítulo 3 - configuração.
Baixei a versão 2.0. A estrutura dos arquivos é essa:
Doctrine
   \Common
   \DBAL
   \ORM
   \Symfony
Pus o Doctrine na pasta projetoORM e ficou assim
projetoORM
   \Doctrine
   \Entities
   \Proxies
   \Util
       \Util\bootstrap.php
       \Util\ConnectionFactory.php
index.php


-->

<?php
/* bootstrap.php */
require_once 'Doctrine\Common\ClassLoader.php';

       $class_loade = new \Doctrine\Common\ClassLoader('\Doctrine\Common', 'Common');
       $class_loade->register();

       $class_loade = new \Doctrine\Common\ClassLoader('\Doctrine\DBAL', 'DBAL');
       $class_loade->register();

       $class_loade = new \Doctrine\Common\ClassLoader('\Doctrine\ORM', 'ORM');
       $class_loade->register();
?>

<?php

/* -------> */ require_once 'bootstrap.php'; # preciso dessa linha? Se preciso, coloco onde?

use Doctrine\ORM\EntityManager,
Doctrine\ORM\Configuration;

class ConnectionFactory {

   private $entityManager = false;

   private $connectionOptions = array(
       'driver' => 'pdo_mysql',
       'host' => 'localhost',
       'user' => 'root',
       'password' => '',
       'dbname' => 'test'
   );

   private function getContext() {
       $config = new Configuration;
       $config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ArrayCache());
       $driverImpl = $config->newDefaultAnnotationDriver(dirname(dirname(__FILE__)) . '\Entities');
       $config->setMetadataDriverImpl($driverImpl);
       $config->setQueryCacheImpl($cache);
       $config->setProxyDir(dirname(dirname(__FILE__)) . '\Proxies');
       $config->setProxyNamespace('DoctrineProject/Proxies');
       return $config;
   }

   public static function getInstance() {
       if (!$entityManager) {
           /* o erro acontece aqui --->*/ $entityManager = EntityManager::create($this->connectionOptions, $this->getContext());
       }
       return $entityManager;
   }

}
?>

<!-- index.php -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
   <head>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
       <title></title>
   </head>
   <body>
       <?php
       require_once 'Project/Util/ConnectionFactory.php';

       $em = ConnectionFactory::getInstance();
       ?>
   </body>
</html>

/*
O erro é esse:
"Fatal error: Class 'Doctrine\ORM\EntityManager' not found in E:\xampp\htdocs\Doctrine\Project\Util\ConnectionFactory.php on line 33"
Ele não conseguiu localizar a classe EntityManage dentro da pasta ORM, embora ela esteja lá. Beleza! por quê?
Alguém tem uma teoria?
*/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depois de um tempo estudando namespace, PHP OO, autoload e postar algumas dúvidas aqui, este problema está resolvido.

Vou postar o código aqui para ajudar outras pessoas.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
   <head>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
       <title></title>
   </head>
   <body>
       <?php
       ini_set("display_errors", true);
       error_reporting(E_ALL | E_NOTICE);

       spl_autoload_register(function ($class) {
                   require_once str_replace("\\", "/", $class . ".php");
               });

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Configuration;
use Doctrine\Common\Cache\ArrayCache;
use entidades\Estudante;
       $config = new Configuration();
       $cache = new ArrayCache();
       $config->setMetadataCacheImpl($cache);
       /*não se esta linha esta certa */$driverImpl = $config->newDefaultAnnotationDriver(array("/entidades"));
       $config->setMetadataDriverImpl($driverImpl);
       $config->setQueryCacheImpl($cache);
       /*não se esta linha esta certa */$config->setProxyDir("/proxies");
       $config->setProxyNamespace("namespace\proxies");
       $config->setAutoGenerateProxyClasses(true);

       $connection_options = array(
           "driver" => "pdo_mysql",
           "user" => "leitor",
           "password" => "",
           "dbname" => "test"
       );

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

       $connection = $em->getConnection();
       $connection->beginTransaction();

       try {
           $estudante = $em->find("entidades\Estudante", 8);
           echo $student->getNome();
       } catch (Exception $e) {
           echo $e->getMessage() . "<br/>";
       }

       $connection->close();
       ?>
   </body>
</html>

Agora o erro é esse:

Class entidades\Estudante is not a valid entity or mapped super class.

Estou pesquisando, mas até agora não achei a solução.

Acredito que seja alguma coisa relacionada às linhas comentadas. Se alguém enxergar o erro, por favor, mostre-me.

Apesar disso, conecta e realiza consultas. O problema são as classes mapeadas.

#essa consulta, por exemplo, funciona
$connection->executeQuery("show tables")->fetchAll();

Compartilhar este post


Link para o post
Compartilhar em outros sites

meu_projeto/
   Doctrine/
       ORM/
       DBAL/
       Common/
   entidades/
       Estudante.php
   index.php

CREATE TABLE IF NOT EXISTS estudante (
 id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 nome varchar(200) NOT NULL,
 matricula varchar(50) NOT NULL,
 PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

<?php

namespace entidades;

/*
* @Entity(repositoryClass="entidades")
* @Table(name="estudante")
*/
class Estudante {
   /*
    * @id
    * @generatedValue(strategy="IDENTITY")
    * @Column(type="integer", nullable="false", unique=true)
    */
   private $id;

   /*
    * @Column(type="string", length=200, nullable=false)
    */
   private $nome;

   /*
    * @Column(type="string", length=50, nullable=false, unique=true)
    */
   private $matricula;

   public function getId() {
       return $this->id;
   }

   public function setId($id) {
       $this->id = $id;
   }

   public function getNome() {
       return $this->nome;
   }

   public function setNome($nome) {
       $this->nome = $nome;
   }

   public function getMatricula() {
       return $this->matricula;
   }

   public function setMatricula($matricula) {
       $this->matricula = $matricula;
   }


}
?>

#index.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
   <head>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
       <title></title>
   </head>
   <body>
       <?php
       ini_set("display_errors", true);
       error_reporting(E_ALL);
       spl_autoload_register(function ($class) {
                   require_once str_replace("\\", "/", $class . ".php");
               });

       use Doctrine\ORM\EntityManager;
       use Doctrine\ORM\Configuration;
       use Doctrine\Common\Cache\ArrayCache;
       use entidades\Estudante;

       $config = new Configuration();
       $cache = new ArrayCache();
       $config->setMetadataDriverImpl($config->newDefaultAnnotationDriver(array("entidades")));
       $config->setProxyDir("proxies");
       $config->setProxyNamespace("proxies");
       $config->setAutoGenerateProxyClasses(true);
       $config->setMetadataCacheImpl($cache);
       $config->setQueryCacheImpl($cache);

       $connection_options = array(
           "driver" => "pdo_mysql",
           "user" => "root",
           "password" => "",
           "dbname" => "test"
       );

       $em = EntityManager::create($connection_options, $config);
       $em->getConnection()->beginTransaction();

       $estudante = new Estudante();
       $estudante->setNome("Zezinho");
       $estudante->setMatricula("2010TI159");

       try {
           $em->persist($estudante);
       } catch (Exception $e) {
           echo $e->getMessage() . "<br/>";
       }

       $em->getConnection()->close();
       ?>
   </body>
</html>

Este é o código completo.

Por que "Class entidades\Estudante is not a valid entity or mapped super class."?

Pesquisei e não encontrei a causa desse erro. O que vi bastante foi "Como integrar o Doctrine ao Zend" ou ao CI e muito ao Symfony.

Alguma teoria?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifique se o nome da tabela está correto.

 

Outra coisa:

@Entity(repositoryClass="entidades")

 

O argumento repositoryClass indica a classe do repositório que deverá ser usada juntamente com a sua entidade. Ou seja, é uma classe por entidade. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eeeeeeeh!!!! funcionou!!!!!

project/
   app/
       model/
           Users.php
       proxies/
       xml/
           model.Users.dcm.xml
   lib/
       Doctrine/
   index.php

#index.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
   <head>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
       <title></title>
   </head>
   <body>
       <?php
       ini_set('display_errors', true);
       error_reporting(E_ALL | E_NOTICE);

       $path_lib = __DIR__ . DIRECTORY_SEPARATOR . 'lib';
       $path_app = __DIR__ . DIRECTORY_SEPARATOR . 'app';
       set_include_path(get_include_path() . PATH_SEPARATOR . $path_lib);
       set_include_path(get_include_path() . PATH_SEPARATOR . $path_app);

       $dir_app = __DIR__ . DIRECTORY_SEPARATOR . 'app';
       $dir_model = $dir_app . DIRECTORY_SEPARATOR . 'model';
       $dir_proxies = $dir_app . DIRECTORY_SEPARATOR . 'proxies';
       $dir_xml = $dir_app . DIRECTORY_SEPARATOR . 'xml';

       spl_autoload_register(function ($class) {
                   require_once str_replace('\\', DIRECTORY_SEPARATOR, $class . '.php');
               });

       $config = new Doctrine\ORM\Configuration();
       $config->setProxyDir($dir_proxies);
       $config->setProxyNamespace('proxies');
       $config->setAutoGenerateProxyClasses(true);

       $driverImpl = new Doctrine\ORM\Mapping\Driver\XmlDriver($dir_xml);
       $config->setMetadataDriverImpl($driverImpl);

       $cacheImpl = new Doctrine\Common\Cache\ArrayCache();
       $config->setMetadataCacheImpl($cacheImpl);
       $config->setQueryCacheImpl($cacheImpl);

       $conetion = array(
           'driver' => 'pdo_mysql',
           'host' => 'localhost',
           'user' => 'root',
           'password' => 'minha_senha',
           'dbname' => 'sql'
       );

       $evm = new Doctrine\Common\EventManager();
       $entity = Doctrine\ORM\EntityManager::create($conetion, $config, $evm);

       $user = new \model\Users();
       $user->setName("kal-el");

       try {
           $entity->persist($user);
           $entity->flush();
           echo 'salvou';
       } catch (Exception $exc) {
           $entity->rollback();
           echo $exc->getMessage();
       }

       $entity->close();

       ?>
   </body>
</html>

#Users.php
<?php

namespace model;

class Users {

   private $id;
   private $name;

   function __construct() {
       $this->id = null;
       $this->name = null;
   }

   public function getId() {
       return $this->id;
   }

   public function setId($id) {
       $this->id = $id;
   }

   public function getName() {
       return $this->name;
   }

   public function setName($name) {
       $this->name = $name;
   }

}
?>

#model.Users.dcm.xml
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">

   <entity name="model\Users" table="users">
       <id name="id" type="integer">
           <generator strategy="IDENTITY" />
       </id>
       <field name="name" type="string" />
   </entity>
</doctrine-mapping>

#tabela
create table sql.users(
id int(5) unsigned not null auto_increment,
name varchar(90) not null,
primary key(id)
)engine=innobd;

 

Troquei as anotações por arquivos XML.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.