Magento 2 ne permet pas de lier des modules à l'aide de liens symboliques

10

J'ai ajouté un module de développement local (git repo séparé) à Magento 2 en utilisant des liens symboliques et cela fonctionnait bien jusqu'à ce que je frappe les modèles PHTML. Après un débogage intensif, j'ai découvert que la classe de système de fichiers Magento 2 ( Magento\Framework\Filesystem\Directory\Read) utilise une isExists()méthode combinée avec un getAbsolutePath()appel pour voir si le modèle PHTML existe. Cependant, la getAbsolutePath()méthode vérifie si le chemin d'accès relatif existe dans le système de fichiers Magento 2 et sinon, elle ajoute la racine Magento 2 à. il. Dans mon cas, le module vit dans un référentiel séparé /git/Atandis que Magento vit /site/Bet ce comportement vérifie l'existence d'un modèle PHTML dans /site/B/git/A.

En bref: les modèles PHTML qui vivent en dehors du système de fichiers racine Magento 2 ne sont pas récupérés, quel que soit le paramètre de configuration système "Autoriser les liens symboliques" activé. Il semble que le paramètre fonctionne, mais uniquement si la source du lien symbolique se trouve toujours dans le système de fichiers Magento 2.

Quelqu'un d'autre a-t-il rencontré cela? Quelle serait la meilleure façon de gérer le développement dans un référentiel git externe?

Jisse Reitsma
la source
Bug / fonctionnalité 50/50. Je dis déposer un problème .
benmarks
@benmarks c'est un problème connu qui a un workaroud, voir ma réponse
Alex Paliarush

Réponses:

9

Solution de contournement si vous utilisez le référentiel de chemin du compositeur pour votre module.

En registration.phpfait:

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Module_Name',
    isset($file) ? dirname($file) : __DIR__
);

Cela enregistrera votre module sous le chemin du lien symbolique dans le répertoire du fournisseur racine de Magento au lieu de son vrai chemin.

fsw
la source
1
Cette solution a fonctionné pour moi jusqu'à ce que je mette à niveau vers Magento 2.3 (j'obtiens l'erreur 'Invalid Template File ...'). Une idée de comment le résoudre?
Pini
Non désolé. Êtes-vous sûr que cela fonctionne lorsque vous n'utilisez pas de lien symbolique? Si c'est le cas, vous devrez déboguer la façon dont M2.3 charge les modèles. Peut-être ouvrir une autre question?
fsw
Cela fonctionne sans le lien symbolique.
Pini
J'utilise Vagrant pendant le développement. Je fais un lien symbolique /vagrant/app/code/Vendor/vers /var/www/shop/app/code/Vendor. Cela l'a résolu pour moi!
BugHunterUK
Je suis revenu. Cette solution ne fonctionne pas. Quand j'ai utilisé ceci pour créer un lien symbolique vers le code de mon module, les routes adminhtml pour mon module ne fonctionneraient pas. J'ai confirmé cela en supprimant le lien symbolique et en copiant les fichiers dans le répertoire app / code. Le plugin a ensuite fonctionné. Vous pouvez confirmer en créant ce module et en y associant des liens: devdocs.magento.com/guides/v2.3/ext-best-practices/… ... vous obtiendrez le même problème que j'ai eu.
BugHunterUK
4

Il devrait également être possible de manipuler le fichier registration.php pour pointer vers votre racine de développement.

Pour vous assurer qu'il est chargé, vous devez exécuter le fichier registration.php quelque part dans votre processus d'amorçage.

Le moyen le plus simple (sans l'installer via Composer) serait de l'ajouter manuellement au vendeur / Composer / Autoload_files.php.

J'ai aussi pensé à écrire un module pour ça. Ce module pourrait également être utile pour les environnements de test d'intégration (pour ajouter et supprimer des modules à la volée sans avoir à les copier quelque part).

=== MISE À JOUR ===

maintenant j'ai écrit le module: http://github.com/davidverholen/magento2-dynamic-component-registry

Je pense aussi qu'il devrait être possible de lier des modules en utilisant des liens symboliques relatifs

David Verholen
la source
3

Il est possible d'activer / autoriser les liens symboliques via les magasins => Configuration => Avancé => Développeur => Paramètres du modèle (comme dans Magento 1.x):

Option de configuration

(Je n'ai pas testé si ce paramètre fonctionne)

Vous pouvez également utiliser des sous-modules, de cette façon, vous n'avez pas besoin de liens symboliques.

Pour le développement, je développe des modules dans un répertoire séparé et j'utilise PHPStorm pour les copier dans mon installation de développement de Magento 2.

Vladimir Kerkhoff
la source
1
Merci. Le paramètre que j'ai mentionné était en effet le paramètre "Autoriser les liens symboliques" sous "Paramètres du modèle". Cela fonctionne bien sous Magento 1.x, mais maintenant sous Magento 2, les fichiers doivent se trouver dans la racine Magento, donc pas n'importe où sur le système de fichiers. Quoi qu'il en soit, je vais bien - je vais probablement utiliser des sous-modules :)
Jisse Reitsma
Jisse, juste une pensée ... vous pouvez également utiliser composer pour assembler des modules séparés lorsque vous produisez vos artefacts de construction, ce qui tend à éviter certains des problèmes que vous pouvez rencontrer avec les sous-modules git, bien que cela puisse ajouter à la complexité de votre construction processus. AFAIK, c'est la méthode recommandée par Magento pour gérer la situation.
Bryan 'BJ' Hoffpauir Jr.
Merci, les options PHPStorm l'ont déjà résolu pour moi, mais comme l'a souligné @ alex-paliurush, il existe certains scénarios où la solution de contournement ne fonctionne tout simplement pas. J'ajouterai un PR à la place.
Jisse Reitsma
Merci aussi Bryan pour votre suggestion. Cependant, le compositeur est parfait lorsqu'il s'agit de sites de production, mais je cherchais une meilleure façon de développer des modules personnalisés. Le compositeur ne devrait pas encore être en jeu, car c'est le moyen de distribuer le code que je dois d'abord développer dans Magento 2, donc le compositeur est toujours à l'origine de divers engagements. Cela étant dit, PhpStorm (et d'autres IDE) offrent déjà une solution pour cela. Donc, le seul problème qui reste est que les sites de production souffrent de cette limitation de lien symbolique, puis vos arguments entrent en jeu :)
Jisse Reitsma
3

Si vous développez en utilisant PHP Storm, copiez simplement le deuxième référentiel dans la racine du projet Magento. Créez ensuite les liens symboliques nécessaires pour activer le module. PHP Storm traitera ce projet comme multiroot et reconnaîtra les deux référentiels. Vous pouvez choisir entre des stratégies de gestion de référentiel synchrones et asynchrones (par défaut) .

Ce problème se produit également lorsque EE (ou tout autre module) est lié à CE à l'aide de liens symboliques. La cause principale est que le registration.phpchemin du module de base est calculé comme chemin réel vers le répertoire (dans votre cas, il est en dehors du projet Magento). C'est pourquoi le chemin relatif est calculé incorrectement, puis le chemin absolu est également incorrect. Si le deuxième référentiel est placé sous la racine Magento, le chemin relatif pointerait vers le vrai chemin du fichier (pas le lien symbolique), mais il serait toujours trouvé, donc tout fonctionnera.

Alex Paliarush
la source