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

Langage PHP Discussion :

Récupérer espace de nom d'un fichier


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut Récupérer espace de nom d'un fichier
    Bonjour,

    J'ai une fonction qui liste des fichiers PHP.

    Est-il possible de récupérer l'espace de nom de ce fichier php autrement que par l'extraction basé sur l'ouverture du fichier et la recherche de la ligne "namespace ..." (exemple : http://pastebin.com/RHKvcKhr) ?

    Merci

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    si tu veux faire ça avec Symfony tu peux faire

    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
    $code = <<<'PHP'
    <?php
     
    require '../symfony/autoload.php.dist';
     
    $base = get_declared_classes();
     
    require '%s';
     
    if (($classes = get_declared_classes()) === $base) {
        exit();
    }
     
    $class = array_pop($classes);
     
    $reflector = new \ReflectionClass($class);
    echo $reflector->getNamespaceName();
    PHP;
     
    $process = new PhpProcess(sprintf($code, $file));
    $process->run();
    echo $process->getOutput();

  3. #3
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    (pendant que je teste ce que tu viens de suggérer, j'explique en détail mon probleme ci-dessous)

    En fait c'est lié à mon sujet d'hier ( sujet ).

    Comme je le disais, j'ai réussi à faire fonctionner l'application en utilisant le finder dans AppKernel. Mais à présent dans l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $finder->name('*Bundle.php')->in(__DIR__ . '/../src/OtherBundles');
    Je dois pouvoir passer un paramètre au in(). Pour cela j'ai une classe qui me renvoie le path absolu de OtherBundles qui est stocké dans un fichier de parametres (un .yml).
    Contrainte cliente, je ne peux pas toucher au fichier config.yml sinon j'aurais mis le parametre dedans, c'est pourquoi je dois avoir un fichier autre.

    Enfin bon, je retourne le bon path, mais ce qu'il se passe c'est que même si il fait bien l'instanciation du bundle (il l'ajoute bien à $bundles[] de registerBundles()) et même si il passe bien ensuite dans la fonction boot(), il ne me charge plus mes routes.

    Le fait que le path du dossier soit en parametre est une volonté cliente (il ne veut pas le figer dans le code).

    En gros :

    NE FONCTIONNE PAS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Voir sujet précèdent
     
    $a = Entity::getMyPath("plugins");
    // lors du pas à pas, $a contient bien le bon path absolu :
    // /var/www/Project/OtherBundles/
    // j'ai bien vérifié qu'il n'y avait pas d'erreur de path
     
    $finder->name('*Bundle.php')->in($a);
    // ...
    $bundles[] = new $class;
     
    // $bundles contient bien ma référence à ma class, il passera plus tard dans le boot() mais route:debug ne contient pas pour autant les routes. WTF ?
    FONCTIONNE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Voir sujet précèdent
     
    $a ="/var/www/Project/OtherBundles/BundleXBundle/OtherBundlesBundleXBundle";
    // lors du pas à pas, $a contient bien le bon path absolu :
    // /var/www/Project/OtherBundles/
     
    $finder->name('*Bundle.php')->in($a);
    // ...
    $bundles[] = new $class;
     
    // $bundles contient bien ma référence à ma class, il passera plus tard dans le boot() et cette fois route:debug contient bien les routes. WTF ?
    C'est pourquoi je me disais que je pouvais recherches tous les bundle, stocker en dur namespace\nomDuBundle et les charges ensuite en parcourant ce que je reçois comme bundles avec $bundles[] = new $class; et remplacer ainsi le finder.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Le problème global c'est que tu veux la possibilité d'ajouter des Bundles sans touché à la conf de base ?

  5. #5
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    C'est exactement cela avec comme pré-requis que je ne sais pas à l'avance si tel ou tel bundle est présent (détection au chargement).

  6. #6
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    J'ai réussi à refaire fonctionner l'application avec le Finder. En fait Symfony2 n'accepte pas de faire de realpath().

    realpath("monRelativePath"). Il faut que le parametre dans le fichier de parametre soit déjà absolu.

    En enlevant le realpath et en mettant mon parametre en absolu (ce qui justifie que plus besoin de realpath) ça fonctionne en passant un parametre à la fonction in().

    Du coup j'arrive maintenant à charger mes bundles sans toucher à ma conf de base juste en ajoutant les instructions de recherche avec le Finder (voir sujet), le boot() chargeant les routes ensuite.

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Je vais voir pour sortir tout ça en bundle, ça sera plus propre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/06/2015, 10h21
  2. Réponses: 0
    Dernier message: 03/06/2015, 18h26
  3. Réponses: 4
    Dernier message: 21/10/2014, 13h05
  4. [XL-2000] Récupérer un/des nom(s) de fichier
    Par Jason T dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 11/06/2009, 17h00
  5. [vb2005]récupérer le nom d'un fichier
    Par stargates dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/07/2005, 10h57

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