IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

question sur ZF2 Autoloader


Sujet :

Zend Framework PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut question sur ZF2 Autoloader
    Bonjour ,

    avant d'ecrire ma question je veux seulement citer que j'ai vraiement essaye tous (lire des tutorial et livre, voir des videos) mais j'ai pas pu avoir une respone et ca commence vraiement a me gener.

    je deteste travailler avec une chose que je ne sais pas comment bien la controller et c'est ca ma source de probleme en faite j'ai vu tous les projet de ZF2 sur internet et tous ces projets se base sur ZendSkeletonApplication jusqu a maintenant c'est pas grave mais ce fameux ZendSkeletonApplication qui est vraiement simple a le fichier init_autoloader.php et c'est ca ou ca commence a devenir compliqué car le but de ce fichier et de faire un autoloader des class et de namespace et apparament tous le monde sauter cette etape sans rien dire ni comment ca marche ni comment faire pour personnaliser alors puique j'aime vraiement personnaliser les choses j'ai essaye de faire la chose suivante :

    1-placer la librairie de ZF2 dans un autre repertoire puis j'ai supprime le dossier vendor
    2-j'ai ajouter cette ligne SetEnv ZF2_PATH "chemin vers ma libraire de ZF2" dans ma httpd.conf

    Pourquoi j'ai fais ca ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    // Composer autoloading
    if (file_exists('vendor/autoload.php')) {
        $loader = include 'vendor/autoload.php';
    }
     
    $zf2Path = false;
     
    if (is_dir('vendor/ZF2/library')) {
        $zf2Path = 'vendor/ZF2/library';
    } elseif (getenv('ZF2_PATH')) {      // Support for ZF2_PATH environment variable or git submodule
        $zf2Path = getenv('ZF2_PATH');
    } elseif (get_cfg_var('zf2_path')) { // Support for zf2_path directive value
        $zf2Path = get_cfg_var('zf2_path');
    }
     
    if ($zf2Path) {
        if (isset($loader)) {
            $loader->add('Zend', $zf2Path);
        } else {
            include $zf2Path . '/Zend/Loader/AutoloaderFactory.php';
            Zend\Loader\AutoloaderFactory::factory(array(
                'Zend\Loader\StandardAutoloader' => array(
                    'autoregister_zf' => true
                )
            ));
        }
    }
     
    if (!class_exists('Zend\Loader\AutoloaderFactory')) {
        throw new RuntimeException('Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.');
    }

    Comme vous pouvez remqarque apartir de la ligne 8 on commence a chercher le chemin de la libraire de ZF2 donc il ya plusieurs methode de faire ca mais j'ai prefere de stocker le chemin comme dans un variable d'environnement alors j'ai essaye pour voir est ce que ca marcher et boom rien ne fonctionne au debut j'ai crus que c'etait le chemin qui n'est pas correcte mais un avec "echo $zf2Path" j'etait sure que ce n'ai pas ca le probleme donc la seul chose qui reste c'etait c'est deux ligne la

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (file_exists('vendor/autoload.php')) {
        $loader = include 'vendor/autoload.php';
    }
    et apparament c'est ici que la magie commence alors j'ai essaye de lire le code et d'essayer de comprendre comment ca marche mais j'ai pas pu surpasser ce probleme

    un aide va vraiement me sauver la vie

    Merci

  2. #2
    Membre averti Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Points : 390
    Points
    390
    Par défaut
    Bonjour Mr User,

    De base, Zend lance le fichier init_autoloader.php ainsi que les fichiers présents dans le dossier config. En regardant de plus près le fichier application.config.php tu peux voir que le contenu des dossiers module et vendor est chargé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    'module_listener_options' => array(
            // This should be an array of paths in which modules reside.
            // If a string key is provided, the listener will consider that a module
            // namespace, the value of that key the specific path to that module's
            // Module class.
            'module_paths' => array(
                './module',
                './vendor',
            ),
    Un autoload permet de charger de façon centralisée un certain nombre de classes. Ainsi, tu n'as plus à faire include() dans chacune de tes classes pour avoir tes dépendances. Le but de passer par ce fichier c'est qu'il permet d'avoir une certaine granularité. Chaque module peut en avoir un afin de charger uniquement les classes dont il a besoin.

    Pourquoi faire cela ? Si on n'indique pas au framework quelles classes il doit charger, il va parcourir l'ensemble des dossiers pour trouver une classe qui n'a pas encore été instanciée (c'était le cas sous Zend 1). Cela prend du temps et diminue les performances.

    Pourquoi ça ne marche pas pour toi ? Tout simplement parce qu'aucune classe n'est chargée. Ayant supprimé le dossier vendor, ton fichier autoload n'est jamais chargé. Comme tu l'as déplacé, tu dois indiquer le nom de ton nouveau dossier à la place du vendor.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (file_exists('TONNOMDEDOSSIER/autoload.php')) {
        $loader = include 'TONNOMDEDOSSIER/autoload.php';
    }
    Maintenant pourquoi ton changement n'a pas fonctionné ? Zend utilise composer pour gérer les dépendances (les différents modules externes) au sein de l'application. C'est à travers cet outil que l'on peut, d'une part, chargé l'ensemble des dépendances et, d'autre part, les mettre toutes à jour avec une commande via la CLI.

    Ton fichier autoload doit normalement ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // autoload.php @generated by Composer
    require_once __DIR__ . '/composer' . '/autoload_real.php';
    return ComposerAutoloaderInit**************::getLoader(); (les étoiles correspondent à une clé générée aléatoirement)
    Tu remarques que ce fichier charge le fichier autoload.real présent dans le dossier composer qui est lui-même dans le dossier vendor. Il ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?php
    
    // autoload_real.php @generated by Composer
    class ComposerAutoloaderInit6f7a6527013df9ec6b12fe2e23577efc
    {
        private static $loader;
    
        public static function loadClassLoader($class)
        {
            if ('Composer\Autoload\ClassLoader' === $class) {
                require __DIR__ . '/ClassLoader.php';
            }
        }
    
        public static function getLoader()
        {
            if (null !== self::$loader) {
                return self::$loader;
            }
    
            spl_autoload_register(array('ComposerAutoloaderInit6f7a6527013df9ec6b12fe2e23577efc', 'loadClassLoader'), true, true);
            self::$loader = $loader = new \Composer\Autoload\ClassLoader();
            spl_autoload_unregister(array('ComposerAutoloaderInit6f7a6527013df9ec6b12fe2e23577efc', 'loadClassLoader'));
    
            $vendorDir = dirname(__DIR__);
            $baseDir = dirname($vendorDir);
    
            $map = require __DIR__ . '/autoload_namespaces.php';
            foreach ($map as $namespace => $path) {
                $loader->set($namespace, $path);
            }
    
            $classMap = require __DIR__ . '/autoload_classmap.php';
            if ($classMap) {
                $loader->addClassMap($classMap);
            }
    
            $loader->register(true);
    
            return $loader;
        }
    }
    Et ce fichier s'occupe de charger d'une part le fichier autoload_classmap:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // autoload_classmap.php @generated by Composer
    $vendorDir = dirname(dirname(__FILE__));
    $baseDir = dirname($vendorDir);
     
    return array(
       // Vide chez moi, je ne m'en suis pas servi pour le moment
    );
    et d'autre part le fichier autoload_namespaces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    // autoload_namespaces.php @generated by Composer
     
    $vendorDir = dirname(dirname(__FILE__));
    $baseDir = dirname($vendorDir);
     
    return array(
        'Zend\\' => array($vendorDir . '/zendframework/zendframework/library'),
        'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
        'Doctrine\\ORM\\' => array($vendorDir . '/doctrine/orm/lib'),
        'Doctrine\\DBAL\\' => array($vendorDir . '/doctrine/dbal/lib'),
        'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib'),
        'Doctrine\\Common\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib'),
        'Doctrine\\Common\\Collections\\' => array($vendorDir . '/doctrine/collections/lib'),
        'Doctrine\\Common\\Cache\\' => array($vendorDir . '/doctrine/cache/lib'),
        'Doctrine\\Common\\Annotations\\' => array($vendorDir . '/doctrine/annotations/lib'),
        'Doctrine\\Common\\' => array($vendorDir . '/doctrine/common/lib'),
        'DoctrineORMModule\\' => array($vendorDir . '/doctrine/doctrine-orm-module/src'),
        'DoctrineORMModuleTest\\' => array($vendorDir . '/doctrine/doctrine-orm-module/tests'),
        'DoctrineModule\\' => array($vendorDir . '/doctrine/doctrine-module/src'),
        'DoctrineModuleTest\\' => array($vendorDir . '/doctrine/doctrine-module/tests'),
    );
    Ce dernier fichier à pour tâche de centraliser les chemins des modules que tu utilises dans ton application. Dans mon cas, la librairie de Zend, le module pour intégrer doctrine à l'application et la console Symfony sont chargés pour cette application.

    Voilà pourquoi ta modification ne fonctionne pas. Pourquoi l'avoir faite ? Qu'est-ce qui te dérange avec la structure de la SkeletonApplication ? Tu peux activer un chargement plus propre en créant un autoloader dans chacun de tes modules et en activant, dans le fichier \config\application.config.php le cache pour les fichiers de configuration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
            // Whether or not to enable a configuration cache.
            // If enabled, the merged configuration will be cached and used in
            // subsequent requests.
            'config_cache_enabled' => true,
            // The key used to create the configuration cache file name.
            'config_cache_key' => "TA CLE ICI",
            // Whether or not to enable a module class map cache.
            // If enabled, creates a module class map cache which will be used
            // by in future requests, to reduce the autoloading process.
            'module_map_cache_enabled' => true,
            // The key used to create the class map cache file name.
            'module_map_cache_key' => "UNE AUTRE CLE ICI",
            // The path in which to cache merged configuration.
            'cache_dir' => "./data/cache/config",
    Tu peux générer tes autoloaders automatiquement via la classmap_generator partagée sur ce site : Classmap_generator

    Dans le fichier module.php de chacun de tes modules, modifie la fonction getAutoLoaderConfig() pour utiliser le ClassMapAutoloader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public function getAutoloaderConfig()
        {
            return array(
                'Zend\Loader\ClassMapAutoloader' => array(
                    __DIR__ . '/autoload_classmap.php',
                ),
                'Zend\Loader\StandardAutoloader' => array(
                    'namespaces' => array(
                        __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__
                    )
                )
            );
        }

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    tout d'abord Merci infiniment Njörd vous m'avez vraiment montrer comment ca marche ce qu'etait pas totalement claire pour moi

    alors je commence par dire ce que j'ai compris ce que j'ai remarqué et ce que je veux avoir

    ce que j'ai compris:
    ============

    un autoloader permet de charger les class et les namespace d'une facon dynamique en se basant sur composer qui donne les chemins de ces dernies afin d'ameliorer la performence

    ce que j'ai remarque:
    =============

    d'apres vous un seul changement que je dois faire c'est dans init_autoloader.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (file_exists('mondossier/autoload.php')) {
        $loader = include 'mondossier/autoload.php';
    }
    peut faire le truc ce que je trouve bizare car ca march tres bien

    ce que je veux avoire:
    =============

    comme vous avez deja remarque le SkeletonApplication contient deja la librairie de zendframework une chose que je ne veux pas avoir alors pour mieux expliquer voici ce que je veux

    1-creer un dossier ZF2 dans /usr/include/ZF2 dans ce dossier il y aura un dossier Zend qui contient la librairie de zendframework
    2-dans le dossier /var je dois avoir ca "config data dossier init_autoloader.php module composer(ce dossier contient autoload.php et le dossier composer) " et finalement le dossier www va etre lui meme le dossier public

    ce que j'ai fais c'est que j'ai fait la premier etape et j'ai ajouter SetEnv ZF2_PATH /usr/include/ZF2 a mon httpd.conf et meme dans mon include_path dans php mais ca marche pas

    j'ai meme changer ce fichier autoload_namespaces.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
     
    // autoload_namespaces.php @generated by Composer
     
    $vendorDir = dirname(dirname(__FILE__));
    $baseDir = dirname($vendorDir);
     
    return array(
        'Zend\\' => array($vendorDir . '/zendframework/zendframework/library'),
    );
    par ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
     
    // autoload_namespaces.php @generated by Composer
     
    return array(
        'Zend\\' => array(getenv('ZF2_PATH')),
    );
    j'espere que je vous n'est pas deranger et merci une autre fois

Discussions similaires

  1. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 21h49
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo