Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Je suis entrain de faire la transition de mon site depuis le zend framework 1 vers le zend framework 2 et il y a quelque chose que je ne comprend vraiment pas avec le système d'autoload du zf2.
Dans le site de base de zf2 l'index.php fait appel au fichier "init_autoloader.php".
Ce fichier appelle le fichier "vendor/autoload.php".
Celui ci fait appel au fichier "autoload_real.php" qui contient une classe.
Cette classe utilise \Composer\Autoload\ClassLoader qui va enregistrer une méthode d'autoloading avec spl_autoload_register. Cette classe utilise un fichier de config pour faire la liaison entre un namespace et un répertoire.
Jusque là, j'arrive à comprend la mécanique. Là où je suis complètement perdu c'est quand je me retrouve avec l'erreur '%s was unable to fetch or create an instance for %s' du fichier ServiceManager.php quand je fait un $sm->get() pour une classe du zf2.
En rajoutant du débug, j'ai l'impression que la méthode de la classe ClassLoader n'est pas appelé quand cette erreur arrive.
Si c'était le cas pour toutes les classes, je comprendrais mais ça n'a l'air de le faire que pour certaines.
J'en arrive donc à mes questions actuelles :
1) Est-ce que ça vous semble normal ou est ce que j'ai bousillé quelque chose sans m'en rendre compte?
2) Pourquoi est ce qu'il faut que certaines classes du framework soient indiqué spécifiquement dans des fichiers de config (Zend\Db\Adapter\Adapter dans "/config/autoload/global.php" par exemple) pour que la classe \Zend\ServiceManager\ServiceManager arrive à la charger.
3) Comment est-ce que je peux savoir quelles classes je vais devoir rajouter dans les fichiers de config pour que mon site fonctionne même dans le cas ou il y a une erreur (par exemple, une requête sql rejeté par mysql) ?
PS : Le fichier qui contient le \Adapter\Adapter :
<?php /** * Global Configuration Override * * You can use this file for overriding configuration values from modules, etc. * You would place values in here that are agnostic to the environment and not * sensitive to security. * * @NOTE: In practice, this file will typically be INCLUDED in your source * control, so do not include passwords or other sensitive information in this * file. */ return array( // ... 'db' => array( 'driver' => 'Pdo', 'dsn' => 'mysql:dbname=test;host=localhost', 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' ), ), 'service_manager' => array( 'factories' => array( 'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory', ), ), ); ;
Hors ligne
Salut en fait tu fais un mélange entre 2 choses :
- Le chargement des fichiers qui se fait de plusieurs manières, soit via un fichier d'autoload comme tu le mentionnes qui va grosso modo faire un mapping entre un namespace et le répertoire du fichier sur le disque, soit en interprétant le namespace pour retrouver le répertoire. La première est simplement plus rapide car pas de "recherche".
- La configuration des services comme le service manager. Tu vas lui définir un mapping entre un nom de service (généralement on utilise le FQCN pour plus de lisibilité) vers une classe ceci dans le but que le service manager te retourne une instance de cette classe. Donc pour pouvoir récupérer une instance d'une classe via le service manager il faut le mettre dans le fichier de configuration du module : module.config.php ainsi quand tu vas faire $this->getServiceLocator()->get('Mon\Nom\De\Mapping') ça va te retourner une instance de la classe associée à ce mapping.
Voila
Hors ligne
Pages: 1