Jump to content

Nom de classe de module et autoloader


Recommended Posts

Bonjour,

j'aimerai faire appel aux méthodes statiques des classes d'un module (que j'ai développé et pour lesquelles j'utilise un espace de nom détaillé dans le composer.json) à partir d'un autre module.

Pour ce faire je fais bien use NomDeLespaceDeNomDuModule\LaClasseAUtiliser;

Puisque visiblement Prestashop ne trouve pas l'espace de nom du module cible (alors que cela marche très bien de manière interne au module) j'essaie de rendre accessibles ces classes dans des méthodes publiques de ma classe NomDuModule. Ainsi, il serait possible de faire un new NomDuModule(), puis de faire appel à une méthode nomDuModule->maMéthode() qui retourne ce que la classe interne au module aurait retourné.

Hélas, Prestashop nous force à implémenter la classe NomDuModule dans le fichier nomdumodule.php, ce qui n'est pas respectueux des règles de nommage des classes pour l'autoloader qui, pour un new NomDuModule () cherche à inclure un fichier appelé NomDuModule .php et non nomdumodule.php et cela génère une erreur :

(1/1) RuntimeException

Case mismatch between class and real file names: "NomDuModule .php" vs "nomdumodule.php".

 

Source : https://devdocs.prestashop.com/1.7/modules/creation/module-file-structure/

Si j'essaye de renommer correctement le fichier de la classe principale du module, cela ne fonctionne pas non plus car le module ne veut plus s'installer (il faut absolument que le nom du fichier soit en minuscule).

 

Je sais qu'il est possible de passer outre l'autoloader en faisant un vieux include_once(), require_once() etc... mais le but ici est d'essayer de respecter un minimum les bonnes pratiques et de ne pas coder comme un chien, donc si quelqu'un a une autre solution que celle-ci je suis preneur ;) .

Merci à vous

 

P.S. : notez que j'ai modifié le nom du module par nomdumodule mais vous vous en seriez douté.

 

Edited by Bruno G (see edit history)
Link to comment
Share on other sites

Bonjour,

Vous ne pouvez pas utiliser de namespace dans la classe principale d'un module.
Donc, si vous voulez utiliser un namespace et l'autoload de composer; vous devez créer une autre classe dans le répertoire src de votre module.
Sinon vous devez utiliser include_once ou require_once.
 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...