0
votes

Même espace de noms avec des fichiers dans différents dossiers

J'essaie de structurer un projet de sorte que certains code généré sont dans un sous-dossier généré / code>, mais il a la même espace de noms que les fichiers du répertoire parent.

Par exemple, j'ai cette structure qui me donne l'erreur Php Fatal Error: Erreur non capturée: Classe 'myProject \ foo' non trouvé code>. P>

est-il possible d'avoir la même espace de noms Pour 2 fichiers différents de différents dossiers comme celui-ci? p> xxx pré>

lib / foo.php code> p> xxx pré> lib / généré / bar.php code> p>

"autoload": {
      "psr-4": {
          "MyProject\\" : "lib/"
      }
  },


4 commentaires

Oui, c'est tout à fait possible. Il vous suffit de vous assurer que foo.php est inclure d à un moment donné, soit explicitement, soit par autoloading.


Mon compositeur.json Fichier automatique achoué l'intégralité de l'espace de noms MyProject.


Chargez-vous également le chargeur automatique ...? Cela n'arrivera pas si vous invoquez directement le fichier généré et qu'il n'inclut pas le chargeur automatique, par exemple ...


Je ne charge pas l'autochargeur dans ma bibliothèque, mais dans un projet, je prends cette bibliothèque avec oui je fais. La réinitialisation de mes fichiers / dossiers sous lib / fonctionne comme prévu.


3 Réponses :


-2
votes

Vous essayez d'utiliser l'espace de nom sans utiliser utiliser em> strong> Essayez de suivre le code ci-dessous qui vous aidera. Comme vous essayez d'accéder à une autre classe, vous devrez accéder via des espaces de noms, sinon vous ne le ferez pas. Suivez ci-dessous le code.

<?php

namespace MyProject;

class Foo {
  ...
}

<?php

namespace MyProject;
use MyProject\Foo;

class Bar {

  public function __construct() {
    $foo = new Foo();
  }
}


1 commentaires

Nouveau FOO dans un espace de noms MyProject fait déjà référence à MyProject \ foo sans un redondant utiliser . Le message d'erreur le dit même.



0
votes

Il ne peut fonctionner que si vous incluez le FOO.PHP à l'appelant la fonction.

Comme vous l'avez mentionné, vous chargez automatiquement l'espace de noms entier avec le compositeur. Les espaces de noms sont comme une structure de répertoire virtuelle. Dans votre cas, chaque classe a le même espace de noms, donc il tente de regarder tous les fichiers dans le même répertoire à cause de laquelle dans votre cas FOO.PHP ne se chargée pas via Compositeur.

Ainsi, c'est mieux à différents répertoire d'espace de noms sage ou les inclure avec chemin.


0 commentaires

3
votes

On dirait que vous utilisez le compositeur pour l'autoloading. Vous pouvez configurer le compositeur pour rechercher plusieurs répertoires pour un espace de noms donné.

Voici quelques échantillons de configuration (en supposant que la charge automatique PSR-4) xxx

si vous pouvez fournir le AutoLoad section de votre projet COMPOSER, je peux fournir des détails plus précis.


4 commentaires

J'ai ajouté ma section AutoLoad. J'étais sous l'impression tout sous lib / serait recherché car tous mes autres dossiers (que je n'ai pas énuméré dans mon exemple) sont correctement trouvés car ils ont une sous-pathes d'espace de noms différent.


Les sous-répertoires doivent correspondre à l'espace de noms. Pour votre dossier généré, l'espace de noms devra être "MyProject \ généré"


L'ajout de la cartographie pour "myProject \\" à la fois "lib /" et "lib / généré" comme décrit ci-dessus devrait fonctionner. Chaque répertoire n'est pas un chemin de recherche, mais plutôt une cartographie exacte.


Je ne voulais pas spécifiquement que mon espace de noms ait myProject \ généré dedans. Ajout d'un tableau des deux valeurs fonctionne!