La Doctrine, de noms et de chargement automatique des entités
Je veux utiliser Doctrine 2 dans mon projet. J'ai quelques problèmes avec elle. J'ai lu les docs mais probablement que je suis en train de faire quelque chose de mal.
Je veux chargement automatique de classes d'entités. Et la méthode de la doc ne fonctionne pas.
Mon bootstrap.php
<?php
require_once "vendor/autoload.php";
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\Driver;
$paths = array("../Entities");
$isDevMode = false;
$classLoader = new \Doctrine\Common\ClassLoader('Entities','../Entities');
$classLoader->register();
//the connection configuration
$dbParams = array(
'driver' => 'pdo_mysql',
'user' => 'xxx',
'password' => 'xxx',
'dbname' => 'xxx',
);
$driver = new Doctrine\ORM\Mapping\Driver\AnnotationDriver(new Doctrine\Common\Annotations\AnnotationReader(),array('../Entities'));
$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
$config->setMetadataDriverImpl($driver);
$em = EntityManager::create($dbParams, $config);
J'ai mon modèle de classes dans le répertoire les Entités. J'ai généré à l'aide de la doctrine du client. Ils ont l'air OK. Il y a des id, des poseurs, des getters et l'espace de au début.
/Entities/ArticleCat.php
<?php
namespace Entities;
use Doctrine\ORM\Mapping as ORM;
/**
* ArticleCat
*
* @ORM\Table(name="article_cat")
* @ORM\Entity
*/
class ArticleCat
{
Mon script où je veux utiliser doctrine:
<?php
require_once 'bootstrap.php';
$article = $em->find('ArticleCat', 21);
echo $article->getName();
Ça ne fonctionne pas. Il ne fonctionne que lorsque je l'utilise de cette façon et je supprimer de l'espace de noms de modèle d'Entité.
<?php
require_once 'bootstrap.php';
require_once 'Entities/ArticleCat.php'; //this line added (manual load)
$article = $em->find('ArticleCat', 21);
echo $article->getName();
Quelle est la bonne manière de l'utilisation de la doctrine et de l'autochargement des entités? Pourquoi l'espace de noms est un problème?
Mes erreurs:
Fatal error: Uncaught exception 'Doctrine\Common\Persistence\Mapping\MappingException'
with message 'Class 'ArticleCat' does not exist' in
/myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php:96
Stack trace: #0 /myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php(40):
Doctrine\Common\Persistence\Mapping\MappingException::nonExistingClass('ArticleCat')
#1 /myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping
/AbstractClassMetadataFactory.php(267): Doctrine\Common\Persistence\Mapping
\RuntimeReflectionService->getParentClasses('ArticleCat')
#2 /myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping
/AbstractClassMetadataFactory.php(297): Doctrine\Common\Persistence\Mapping
\AbstractClassMetadataFactory->getParentClasses('ArticleCat')
#3 /myproject/vendor/doc in /myproject/vendor/doctrine/common/lib/Doctrine/Common/Persistence
/Mapping/MappingException.php on line 96
OriginalL'auteur adek | 2013-10-08
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser le nom de classe entièrement qualifié avec l'espace de noms.
Quand vous avez une erreur à propos CG des classes proxy essayez de générer votre proxy classes
bonne chance!
c'est un script shell
OriginalL'auteur Serge Velikanov
Si vous utilisez compositeur, vous voulez être sûr que vous avez le 'autoload' dans votre compositeur.json:
Le problème est résolu pour moi. Je ne suis pas en utilisant tout l'espace de noms dans ma classe d'entité. Mon compositeur.json vit dans mon inc répertoire et l'Entité répertoire référencé ici inc/de l'Entité.
OriginalL'auteur Codezilla
Hmm, j'ai toujours utilisé le
ClassLoader
quand il s'agit de l'utilisation des espaces de noms. J'ai eu beaucoup de problèmes avec elle que j'ai 'm à l'aide d'une sorte de classe de configuration avec toutes lespath/to/src
'j'ai besoin.E. g. si votre chemin est
path/to/src
et votre nom de classe estEntities\ArticleCat
puis la structure de répertoire pour l'emplacement du fichierArticleCat.php
estMaintenant tout ce que vous devez faire est de créer un
ClassLoader
pourEntities
et de la classe
ArticleCat
doit maintenant être disponible à l'aide de laEntityManager
ou
OriginalL'auteur dbf