Vous n'êtes pas connecté - Connexion ou Créer un compte

Classée dans Questions > Questions / Réponses

Intégrer Doctrine 2 à Zend Framework 1.1x

Administrateur
Une annonce aurait pu être ici :'(

Doctrine ORM 2 offre de meilleures performances que sa première version en tirant partie des nouveautés apportées par PHP 5.3. Nous allons voir, ici, comment l'intégrer à Zend Framework 1.11.11.

Installation / mise en place

Tout d'abord, il faut commencer par télécharger la dernière version de Doctrine 2. Vous pourrez la trouver sur le site de Doctrine 2.

Vous devrez extraire le répertoire Doctrinede l'archive dans le répertoire libraryde votre projet.

Initialisation

Il faut ensuite placer le code suivant dans le fichier Bootstrap.phpde votre projet :

protected function _initDoctrine()
{
	$options = $this->getOptions();
	$doctrinePath = $options['includePaths']['library'];
	require_once $doctrinePath . '/Doctrine/Common/ClassLoader.php';
	$autoloader = Zend_Loader_Autoloader::getInstance();

	$doctrineAutoloader = array(new \Doctrine\Common\ClassLoader(), 'loadClass');
	$autoloader->pushAutoloader($doctrineAutoloader, 'Doctrine');

	$classLoader = new \Doctrine\Common\ClassLoader('Entities', realpath(__DIR__ . '/models/'), 'loadClass');
	$autoloader->pushAutoloader(array($classLoader, 'loadClass'), 'Entities');
	$classLoader = new \Doctrine\Common\ClassLoader('Symfony', realpath(__DIR__ . '/../library/Doctrine/'), 'loadClass');
	$autoloader->pushAutoloader(array($classLoader, 'loadClass'), 'Symfony');

	if (APPLICATION_ENV == "development") {
		$cache = new \Doctrine\Common\Cache\ArrayCache();
	} else {
		$cacheOptions = $options['cache']['backendOptions'];
		$cache = new \Doctrine\Common\Cache\MemcacheCache();
		$memcache = new Memcache;
		$memcache->connect($cacheOptions['servers']['host'], $cacheOptions['servers']['port']);
		$cache->setMemcache($memcache);
	}

	$config = new \Doctrine\ORM\Configuration()
	$config->setMetadataCacheImpl($cache);
	$driverImpl = $config->newDefaultAnnotationDriver(APPLICATION_PATH . '/models/Entities');
	$config->setMetadataDriverImpl($driverImpl);
	$config->setQueryCacheImpl($cache);
	$config->setProxyDir(APPLICATION_PATH . '/models/Proxies');
	$config->setProxyNamespace('Proxies');

	if (APPLICATION_ENV == "development") {
		$config->setAutoGenerateProxyClasses(true);
	} else {
		$config->setAutoGenerateProxyClasses(false);
	}

	$em =  \Doctrine\ORM\EntityManager::create($options['db'], $config);

	Zend_Registry::set('em', $em);
	return $em;
}

Ce code permet d'initialiser la connexion avec la base de données et d'instancier un EntityManager : la classe la plus importante dans Doctrine 2. Vous remarquerez plusieurs antislashs (\) qui représentent le nouveau modèle dit de namespace (espace de nommage, en français). C'est un procédé permettant de simplifier le nommage, chargement de classes depuis PHP 5.3.

Configuration

À présent, voyons les options de configuration que l'on passera à Doctrine dans le fichier de configuration du projet :

[production]

includePaths.library = APPLICATION_PATH "/../library"
; Chargement de l'aide d'action
resources.frontController.actionHelperPaths.My_Controller_Action_Helper = "My/Controller/Action/Helper"

;; DB
db.driver = "pdo_mysql"
db.host = "localhost"
db.dbname = "dbname"
db.user = "dbuser"
db.password = "somePassword"

;; Cache
cache.frontendOptions.lifetime = 86400
cache.frontendOptions.automatic_serialization = true
cache.frontendOptions.cache_id_prefix = prfx
cache.backend = Memcached
cache.backendOptions.servers.host = 127.0.0.1
cache.backendOptions.servers.port = 11211
cache.backendOptions.servers.persistent = true
cache.backendOptions.compression = false

[development : production]

;; DB
db.user = "root"
db.password = ""

Modèle de base

A présent, voyons la construction d'un modèle de classe d'abstraction de la base de données :

namespace Entities;
/**
 * @Entity
 * @Table(name="users")
 */
class User
{

    /** @Id @Column(type="integer") @GeneratedValue */
    public $id;
    
    /** @Column(length=50,nullable=true) */
    public $name;
    
    /** @Column(length=50) */
    public $login;
    
    /** @Column(length=32) */
    public $password;

    /** @Column(type="integer") */
    public $role;

}

Aide d'action

Maintenant, nous avons besoin d'un moyen pratique d'accéder à notre EntityManager depuis un contrôleur. Nous créons donc une aide d'action que l'on nommera Em.

class My_Controller_Action_Helper_Em extends Zend_Controller_Action_Helper_Abstract
{

	/**
	* Entity manager
	* @var \Doctrine\ORM\EntityManager
	*/
	private $_em = null;

	/**
	* Return entity manager
	* Could be overriden to support custom entity manager
	*
	* @return \Doctrine\ORM\EntityManager
	*/
	public function getEntityManager() 
	{
	    if ( $this->_em == null) {
    		$this->_em = Zend_Registry::get('em');
	    }
    	    return $this->_em;
	}

	/**
	* @return \Doctrine\ORM\EntityManager
	*/
	public function direct() 
	{
	    return $this->getEntityManager();
	}

}

Utilisation de l'aide d'action

Voyons comment utiliser cette aide d'action depuis un contrôleur à travers un exemple rapide :

class Default_IndexController extends Zend_Controller_Action
{


    public function indexAction()
    {
        $user = new \Entities\User();
        $user->name = 'test';
        $user->login = 'test';
        $user->password = md5('123456');

        $em = $this->_helper->Em();
        $em->persist($user);
        $em->flush();
    }

}

Sources

Voici quelques ressources citées par l'article ayant inspiré celui-ci :

Cette page est fortement inspirée de l'article Integrating Doctrine2 ORM in Zend Framework project du site Victim of Babylon.

Voir les 5 réponses

5 réponses

· #

Bonjour, je suis en train d'intégrer Doctrine 2 à un projet sous ZF 1.11 et j'avoue que cela ne fonctionne pas comme dans le tutorial. Le helper Em n'est pas trouvé par l'application.

J'ai mis le projet sur Github : https://github.com/shadowfree/ZF-tutorial-d2

Je pense que le problème vient surement de ma conf.

Merci pour votre aide

Modération/Modifications

Edité le 2 oct. 2014 - 13:04 par Administrateur

· ^ début
Shadowfree
· #

Bonjour, je suis en train de travailler sur l'intégration de Doctrine2 dans un projet Zend Framework 1.11 et je n'arrive pas à aller au bout. J'ai une erreur au niveau de l'appel du helper.

Message: Action Helper by name Em not found

J'ai mis mon projet sur Github : https://github.com/shadowfree/ZF-tutorial-d2

Comme je débute avec Zend, je ne serais pas étonné que le problème vienne de ma conf.

Modération/Modifications

Edité le 2 oct. 2014 - 13:05 par Administrateur

· ^ début
Shadowfree
· #

Bonjour,

De mémoire, il faut indiquer à Zend Framework via le fichier de configuration l'emplacement où il doit chercher les aides d'action que vous créez et qui ne se trouvent pas dans le même répertoire que les aides d'actions par défaut de Zend.

Il me semble qu'il vous manque une ligne du genre :

resources.frontController.actionHelperPaths.My_Controller_Action_Helper = "My/Controller/Action/Helper"

Tenez-moi au courant si cela résout ou non votre problème.

Modération/Modifications

Edité le 4 juil. 2014 - 15:58 par Administrateur

· ^ début
Administrateur
· #

C'est exactement ce qu'il manquait.

Je vous remercie pour votre réactivité.

· ^ début
Shadowfree
· #

Je vous en prie.

Je posterai bientôt un tutoriel plus complet et détaillé que celui-ci sur l'intégration de Doctrine 2.1 avec Zend Framework 1.11 : intégration que je viens tout juste de finaliser et utilisant des composants simplifiant la configuration de Doctrine 2.1 avec Zend Framework.

· ^ début
Administrateur

Il n'est plus possible de répondre à cette question car elle marquée comme résolue.