Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Après avoir fini quelques tests, et mise ne place d'une architecture pour metre en place des services soap, je voudrais mettre tout cela dans un module soap.
J'ai donc crée l'architecture suivante :
-modules
-soap
-controllers
TestController
AbstractController
-models
TestSoapService
Jai donc dans mon bootstrap :
set_include_path('.' . PATH_SEPARATOR . '../lib' . PATH_SEPARATOR . './modules/soap/models' . PATH_SEPARATOR . './modules/soap/controllers' . PATH_SEPARATOR . get_include_path()); ...... ..... $frontController->addModuleDirectory('./modules');
J'ai donc ma classe Soap_TestController qui étend Soap_AbstractController.
class Soap_TestController extends Soap_AbstractController { public function indexAction() { $this->_execSoapService('TestSoapService'); } }
Mon probleme est que lorsque j'appelle la page : http://localhost/mon_app/soap/Test/Index
J'ai le message suivant :
Warning: Zend_Loader::include_once(Soap\AbstractController.php) [function.Zend-Loader-include-once]: failed to open stream: No such file or directory in C:\dev\php\workspace\lib\Zend\Loader.php on line 83 Warning: Zend_Loader::include_once() [function.include]: Failed opening 'Soap\AbstractController.php' for inclusion (include_path='./modules\soap\controllers;.;../lib;../lib/Soap;./modules/soap/models;./modules/soap/controllers;.;C:\php5\pear')
Apparement il cherche ma classe dans le mauvais dossier (Soap au lieu de Soap/controllers), vous auriez une idée pour que ça marche?
Merci d'avance.
Seb
Hors ligne
http://localhost/mon_app/soap/Test/Index
Ca correspond au module soap, au controller Test et l'action Index.
Ton controller devrait s'appeller TestController imo.
Hors ligne
Non car dans le cas d'une architecture modulaire tous les noms des controllers d'un module doit être préfixés par le nom du module.
Donc : Nommodule_NomController
Quelqu'un d'autre?
Hors ligne
Pour moi, le problème viens de l'héritage.
Quand le zf charge le controller, il trouve bien le Soap_TestController. mais pour charger la classe dont cette classe hérite (donc Soap_AbstractController), il ne va pas aller dans le dossier des controllers mais va regarder dans l'include path.
Donc il va aller voir dans modules/soap/controllers/Soap/ pour charger le fichier AbstractController.php.
Donc soit tu renommes ton fichier en SoapAbstractController que tu laisse là où il est, soit tu le place dans models/Soap/AbstractController.php (solution que j'utiliserais, mais ça n'engage que moi)
La convention de nommage fait que dans les noms des classes, les _ sont remplacés par des / pour charger les fichiers (je suppose que tu utilise l'autload?)
Hors ligne
Oui j'autoload ... Bon je vais jeter un oeil à ce que tu me dis ... merci beaucoup de ta réponse.
Hors ligne
Bon la solution de renommer le fichier ne me plait pas trop même si ça marche, parce que du coup la convention de nommage est biaisée, tous les controlleurs seraient nommés normalement sauf celui ci.
La solution de le mettre dans models/soap ne me plait pas plus étant donné que c'est vraiment mon controlleur de base pour les services soap, tous les autre scontrollers reposent dessus, je le vois mal dans models, la ça serait le model MVC qui serait biaisé (même si ça marche).
Il reste 2 solutions :
-ne pas utiliser l'autoload.
-faire un "require_once('AbstractController.php');" juste avant "class Soap_TestController extends Soap_AbstractController" et garder l'autoload, ce que j'ai fais pour l'instant.
Une petite question rapide, l'autoload est vraiment il plus gourmant que de charger les classes soit même? Quelqu'un aurait essayé de bencher ?
Merci beaucoup Mr.MoOx , clair, concis et efficace
Hors ligne