[EDIT - 18/03/2011 - 10:00]
Bonjours,

C'est avec l'esprit plus clair du matin que je me suis remis à la tâche.
J'ai penser, avec quelques heures de retard, qu'il serait judicieux de tenter de changer la valeur de ma constante "RACINE" qui contient le chemin vers la racine du site en "C:\\..." le résultat est qu'aucun problème ne surviens pour le chargement des classes.

J'en déduis que ma solution de rajouter un alias pour l'espace de nom des entités est une solution viable pour contourner mon problème.

La solution consiste donc à rajoutez cette ligne lors de la configuration de doctrine (dans le bootstrap donc) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$configurations->addEntityNamespace('<Lettre du disque dur>', '<Lettre du disque dur>:');
En espérant faire gagner un peut de temps à certains et en m'excusant de l'éventuel perte de temps des 20 lectures de mon sujet.

Bonne journée.

P.S. : A noté que j'obtiens encore des erreurs, les classes de définitions des tables ne sont pas reconnus comme existantes.
Je me penche sur la question et vous tiens au courant si je ne parviens pas à résoudre le problème.

Merci encore de votre attention.
[/EDIT - 18/03/2011 - 10:00]


Bonjour,

Je suis en train d'essayer Doctrine2.
J'utilise le Getting Started du site de Doctrine.
Mon boodstrap, qui se nomme doctrine.php, a été fait à partir de la documentation du site de Doctrine.

Présentation de l'arborescence :
  • Doctrine (racine de l'application, nom du framework)
    • configurations
      • general.php
      • doctrine.php (boodstrap)
    • controlleurs
    • librairies
      • Doctrine
        • Common
        • DBAL
        • ORM
        • Symfony
      • erreur.php (juste pour le set_error_handler)
    • modeles
      • entities
        • Bug.php
        • Product.php
        • User.php
      • proxies
      • schemaXML
    • vues


Je suis à l'étape de la génération des schéma des tables.
Je suis donc aller voir la partie de la documentation traitant des outils pour voir comment je devais mettre ça en place.

L'erreur que j'ai c'est que l'alias de namespace d'entité "C" n'est pas connu.
Voilà le message :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
Fatal error:  Uncaught exception 'Doctrine\ORM\ORMException' with message 'Unknown Entity namespace alias 'C'.' in C:\Dev\PHP\Doctrine\librairies\Doctrine\ORM\ORMException.php:114
Stack trace:
#0 C:\Dev\PHP\Doctrine\librairies\Doctrine\ORM\Configuration.php(150): Doctrine\ORM\ORMException::unknownEntityNamespace('C')
#1 C:\Dev\PHP\Doctrine\librairies\Doctrine\ORM\Mapping\ClassMetadataFactory.php(155): Doctrine\ORM\Configuration->getEntityNamespace('C')
#2 C:\Dev\PHP\Doctrine\librairies\Doctrine\ORM\EntityManager.php(247): Doctrine\ORM\Mapping\ClassMetadataFactory->getMetadataFor('C:\Dev\PHP\Doct...')
#3 C:\Dev\PHP\Doctrine\index.php(15): Doctrine\ORM\EntityManager->getClassMetadata('C:\Dev\PHP\Doct...')
#4 {main}
  thrown in C:\Dev\PHP\Doctrine\librairies\Doctrine\ORM\ORMException.php on line 114
Jusque là je dirais... Tout à fait logique puisque la méthode \Doctrine\ORM\Mapping\ClassMetaDataFactory::getMetaDataFor($className) considère le symbole ":" comme le caractère suivant un alias.
Etant sous windows je me trouve avec un chemin du type "C:\..." comme vous pouvez le voir sur le message d'erreur.

Ma question est de savoir si il est possible de régler ce problème sans avoir à bidouiller.
Par exemple j'ai essayer de rajouter le caractère "C" en alias de l'espace de nom "C:" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$configurations->addEntityNamespace('C', 'C:');
Problème : Je me retrouve avec un chemin du type "C:\\...", je crains que cela ne pose quelques problèmes.
Effectivement j'ai des messages d'erreurs par la suite m'indiquant que la classe n'existe pas.
Les mêmes message sont présent si je me tente le tout en brutasse avec un :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$gestionnaireEntite->getClassMetadata('\modeles\entities\Product')

Bref, le petit résumé qui fait plaisir :
1) Est-il possible de régler le problème venant des chemins d'accès windows ?
2) Tout à fait optionnel, pensez-vous que le problème de la "non existence" des classes soit lié au premier point ?



Puisque l'on ne donne jamais suffisamment et que je ne suis pas certain de ce dont vous pourriez avoir besoin, voilà quelques sources :

Index.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
require_once dirname(__FILE__) .'/configurations/general.php';
 
/*
 * Génération des schémas de la base de données.
 */
 
	$outilSchema = new \Doctrine\ORM\Tools\SchemaTool($gestionnaireEntite);
	echo '<pre>'; // Juste là pour avoir un affichage plus correct des fatal error
	$classes = array(	$gestionnaireEntite->getClassMetadata(MOD_REP . 'entities\Product'),
						$gestionnaireEntite->getClassMetadata(MOD_REP . 'entities\Bug'),
						$gestionnaireEntite->getClassMetadata(MOD_REP . 'entities\User') );
	/**/
	$outilSchema->createSchema();
 
 
/* Fin du fichier index.php */
./configurations/general.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
define('DEVELOPPEMENT',	TRUE);
 
define('RACINE',    	realpath(__DIR__ . DIRECTORY_SEPARATOR . '..') . DIRECTORY_SEPARATOR);
define('CONF_REP',		RACINE . 'configurations' . DIRECTORY_SEPARATOR);
define('LIB_REP',   	RACINE . 'librairies' . DIRECTORY_SEPARATOR);
define('CONT_REP',  	RACINE . 'controleurs' . DIRECTORY_SEPARATOR);
define('VUES_REP',  	RACINE . 'vues' . DIRECTORY_SEPARATOR);
define('MOD_REP',   	RACINE . 'modeles' . DIRECTORY_SEPARATOR);
 
require_once LIB_REP . 'erreur.php';
require_once 'doctrine.php';
 
/* Fin du fichier general.php */
./configurations/doctrine.php (bootstrap - pour les fanas du CTRL + F )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
// Configuration de l'autoLoader :
 
	require_once LIB_REP . 'Doctrine/Common/ClassLoader.php';
 
	$chargeurClasse = new \Doctrine\Common\ClassLoader('Doctrine', LIB_REP);
	$chargeurClasse->register();
 
	$chargeurClasse = new \Doctrine\Common\ClassLoader('Symfony', LIB_REP . 'Doctrine');
	$chargeurClasse->register();
 
 
// Configuration de l'EntityManager :
 
	use	Doctrine\ORM\EntityManager,
		Doctrine\ORM\Configuration;
 
	$cache = NULL;
	if (DEVELOPPEMENT)
	{
		$cache = new \Doctrine\Common\Cache\ArrayCache;
	}
	else
	{
		$cache = new \Doctrine\Common\Cache\ApcCache;
	}
 
 
	$configurations = new Configuration;
	$configurations->setMetadataCacheImpl($cache);
	//$driverImpl = new \Doctrine\ORM\Mapping\Driver\XmlDriver(MOD_REP . 'schemaXML');
	$driverImpl = $configurations->newDefaultAnnotationDriver(MOD_REP . 'entities');
	$configurations->setMetadataDriverImpl($driverImpl);
	$configurations->setQueryCacheImpl($cache);
	$configurations->setProxyDir(MOD_REP . 'proxies');
	$configurations->setProxyNamespace('\modeles\proxies');
	//$configurations->addEntityNamespace('C', 'C:');
 
	$generationAutoClassesProxy = FALSE;
	if (DEVELOPPEMENT)
	{
		$generationAutoClassesProxy = TRUE;
	}
	$configurations->setAutoGenerateProxyClasses(FALSE);
 
	$optionsConnexion = array(	'driver'	=> 'pdo_mysql',
								'host'		=> 'localhost',
								'dbname'	=> 'doctrine_db',
								'user'		=> 'doctrine',
								'password'	=> 'm4rq8tnt');
 
	$gestionnaireEvenement = new \Doctrine\Common\EventManager();
	$gestionnaireEntite = EntityManager::create($optionsConnexion, $configurations, $gestionnaireEvenement);
 
 
/* Fin du fichier doctrine.php */
./modeles/entities/Bug.php (je ne met pas les autres, c'est juste pour la forme globale des annotations)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php
use \Doctrine\Common\Collections\ArrayCollection;
 
/**
 * @Entity @Table(name='bugs')
 */
class Bug
{
	/**
	 * @Id @Column(type='integer') @GeneratedValue
	 */
	public $id;
 
	/**
	 * @Column(type='string')
	 */
	public $description;
 
	/**
	 * @Column(type='datetime')
	 */
	public $created;
 
	/**
	 * @Column(type='string')
	 */
	public $status;
 
 
	/**
	 * @ManyToOne(targetEntity='User', inversedBy='assignedBugs')
	 */
	private $engineer;
 
 
	/**
	 * @ManyToOne(targetEntity='User', inversedBy='reportedBugs')
	 */
	private $reporter;
 
 
	/**
	 * @ManyToMany(targetEntity='Product')
	 */
	private $products = NULL;
 
 
	public function __construct)
	{
		$this->products = new ArrayCollection();
	}
 
	public function setEngineer($engineer)
	{
		$enginner->assignedToBug($this);
		$this->engineer = $engineer;
	}
 
	public function getEngineer()
	{
		return $this->engineer;
	}
 
	public function setReporter($reporter)
	{
		$reporter->addReportedBug($this);
		$this->reporter = $reporter;
	}
 
	public function getReporter()
	{
		return $this->reporter;
	}
 
	public function assignToProduct($product)
	{
		$this->products[] = $product;
	}
 
	public function getProducts()
	{
		return $this->products;
	}
}
 
 
/* Fin du fichier Bug.php */
Pour les plus motivés, ou ceux qui préfère avoir les sources :
Vous trouverez ici deux archives contenant les sources. Une au format .7z et une autre au format .zip.


Merci à tous d'avoir pris le temps de lire mon problème. Encore un peut plus à ceux qui pourrons ou tenterons de m'aider.

Bonne journée.