Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework
Zend Framework Forum d'entraide sur la programmation PHP avec Zend Framework. Avant de poster -> FAQ ZF, Cours ZF
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/02/2011, 23h34   #1
Membre à l'essai
 
Inscription : mars 2008
Messages : 48
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 48
Points : 24
Points : 24
Par défaut Autoloader entre controller de modules differents

Bonjour.
Mon application a 3 modules. Sur certaines fonctionnalités, ils sont très semblables. Du coup, j'en ai créé un 4e, sobrement appelé default.
Le principe serait que dans chaque module, certains controllers étendent ceux du module default, afin de ne pas dupliquer le code.
Ex:
Code :
class Sports_BlocController extends Default_BlocController
dans le fichier application/modules/sports/controllers/BlocController.php

Pb: l'autoloading sur le Default_BlocController ne se fait pas.

configuration de mon application (n'est copiée que la partie relative à mon pb):
application/config/main.ini
Code :
1
2
3
4
Autoloadernamespaces[] = "Zend_"
Autoloadernamespaces[] = "My_"
bootstrap.path = APPLICATION_PATH "/bootstrap/Bootstrap.php"
resources.modules[]=
application/bootstrap/Bootstrap.php
Code :
1
2
3
4
5
6
7
8
9
	protected function _initDefaultModuleAutoloader() {
		$this->_resourceLoader = new Zend_Application_Module_Autoloader(
			array(
				'namespace' => 'Default',
				'basePath' => APPLICATION_PATH.'/modules/default'
			)
		);
		return $this->_resourceLoader;
	}
application/modules/default/Bootstrap.php
Code :
1
2
3
class Default_Bootstrap extends Zend_Application_Module_Bootstrap
{
}
application/modules/sports/Bootstrap.php
Code :
1
2
3
class Sports_Bootstrap extends Zend_Application_Module_Bootstrap
{
}
Merci d'avance pour votre aide.
danidan75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 03h06   #2
Membre actif
 
Homme Ahmed Benlahsen
Ingenieur BI - Dev Web Senior
Inscription : décembre 2009
Messages : 118
Détails du profil
Informations personnelles :
Nom : Homme Ahmed Benlahsen
Localisation : Maroc

Informations professionnelles :
Activité : Ingenieur BI - Dev Web Senior

Informations forums :
Inscription : décembre 2009
Messages : 118
Points : 157
Points : 157
Envoyer un message via MSN à abenlahsen Envoyer un message via Skype™ à abenlahsen
Bonjour danidan75,

C'est quoi le message d'erreur Zend ?
Si je comprends bien, tu as l'erreur que quand tu accède, via browser, au module "Sports" ?
abenlahsen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 08h51   #3
Membre à l'essai
 
Inscription : mars 2008
Messages : 48
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 48
Points : 24
Points : 24
Citation:
Fatal error: Class 'Default_BlocController' not found in C:\www\site\application\modules\sports\controllers\BlocController.php on line 4
Et le problème se produit pour tous les modules (excepte, bien sur, default)
danidan75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 12h26   #4
Membre actif
 
Homme Ahmed Benlahsen
Ingenieur BI - Dev Web Senior
Inscription : décembre 2009
Messages : 118
Détails du profil
Informations personnelles :
Nom : Homme Ahmed Benlahsen
Localisation : Maroc

Informations professionnelles :
Activité : Ingenieur BI - Dev Web Senior

Informations forums :
Inscription : décembre 2009
Messages : 118
Points : 157
Points : 157
Envoyer un message via MSN à abenlahsen Envoyer un message via Skype™ à abenlahsen
@danidan75,

Essaye ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
protected function _initDefaultModuleAutoloader() {
	$moduleLoader = new Zend_Application_Module_Autoloader(array(
		'namespace' => 'Default',
		'basePath' => APPLICATION_PATH . '/modules/default'
	));
 
	$this->bootstrap('frontController');
	$front = $this->frontController;
 
	$modules = $front->getControllerDirectory();
	$default = $front->getDefaultModule();
 
	foreach (array_keys($modules) as $module) {
		if ($module === $default) {
			continue;
		}
		$autoLoader->pushAutoloader(new Zend_Application_Module_Autoloader(array(
			'namespace' => ucwords($module),
			'basePath' => $front->getModuleDirectory($module),
		)));
	}
}
abenlahsen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 13h05   #5
Membre à l'essai
 
Inscription : mars 2008
Messages : 48
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 48
Points : 24
Points : 24
J'ai légèrement adapté
Code :
$autoLoader->pushAutoloader
devenant
Code :
Zend_Loader_Autoloader::getinstance()->pushAutoloader
, mais le message d'erreur reste le même.
De plus, je pense que le code que vous m'avez proposé fait exactement l'inverse de ce que je voudrais: je souhaite que les controllers du module "default" soient accessible, via l'autoloading, par tous les autres.
En fait, l'équivalent d'un:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
protected function _initDefaultModuleAutoloader() {
	$moduleLoader = new Zend_Application_Module_Autoloader(array(
		'namespace' => 'Default',
		'basePath' => APPLICATION_PATH . '/modules/default'
	));
	$moduleLoader->addResourceTypes(array(
		'controller' => array(
			'path' => 'controllers',
			'namespace' => ''
		)
	));
}
Ainsi, Default_BlocController pointerait sur APPLICATION_PATH . '/modules/default/controllers/BlocController.php'. Mais la chaine vide étant interdite pour le namespace, ça bloque.
danidan75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 13h56   #6
Membre actif
 
Homme Ahmed Benlahsen
Ingenieur BI - Dev Web Senior
Inscription : décembre 2009
Messages : 118
Détails du profil
Informations personnelles :
Nom : Homme Ahmed Benlahsen
Localisation : Maroc

Informations professionnelles :
Activité : Ingenieur BI - Dev Web Senior

Informations forums :
Inscription : décembre 2009
Messages : 118
Points : 157
Points : 157
Envoyer un message via MSN à abenlahsen Envoyer un message via Skype™ à abenlahsen
Par défaut Créer un controller commun dans ta propre librairie

@danidan75,

Je te conseil de créer un autre controller commun dans le répertoire "My" et que lui hérite de Zend_Controller_Action.
Ce controller contiendra les fonctions communes et tu fais hériter tes controllers dans tes modules de ce dernier.

Qu'est-ce que tu en pense ?
abenlahsen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 15h30   #7
Membre à l'essai
 
Inscription : mars 2008
Messages : 48
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 48
Points : 24
Points : 24
J'y avais pensé, mais estimais qu'un controller n'avait rien à faire dans mes librairies, fut-il un abstract controller.
Au final, je prends la solution
Code :
1
2
3
4
5
6
$this->_resourceLoader->addResourceTypes(array(
	'controller' => array(
		'path' => 'controllers',
		'namespace' => 'Base'
	)
));
Mes controllers de base se nommeront Default_Base_BlocController, Default_Base_WhateverController, ... ce qui me permettra de laisser mes fichiers à l'endroit où ils sont censés se trouver: dans leur module. Et de définir des vues par défaut associées au controllers sus-mentionnés, bref un site par défaut auquel les 3 autres modules se référeront fréquemment.
La solution apportée n'est pas géniale, mais me semble être la moins crade.
Si qq'un en a une correspondant à ce que je voulais au début, qu'il n'hésite pas à se manifester.

@abenlahsen: merci bcp pour votre aide
danidan75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 16h37   #8
Membre à l'essai
 
Inscription : avril 2004
Messages : 19
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 19
Points : 20
Points : 20
Pour mon projet j'ai eu besoin d'étendre des classes communes.
Mes classes parent sont des abstract.

Je l'ai ait placer dans le dossier /application/controllers/

dans application.ini : autoloaderNamespaces.extension[] = "controllers_"
et dans l'indes.php du repertoire public j'ai ajouté au set_include_path : "realpath(APPLICATION_PATH ),"


j'espère que ca pourra t'aider.
greffzion est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h34.


 
 
 
 
Partenaires

Hébergement Web