Magento 2 не дозволяє зв'язувати модулі за допомогою символьних посилань


10

Я додав модуль локальної розробки (окремий git repo) до Magento 2 за допомогою символічних посилань, і він працював чудово, поки не потрапив на шаблони PHTML. Після важкої налагодження я з'ясував, що клас файлової системи Magento 2 ( Magento\Framework\Filesystem\Directory\Read) використовує isExists()метод, поєднаний з getAbsolutePath()викликом, щоб перевірити, чи існує шаблон PHTML. Однак getAbsolutePath()метод перевіряє, чи існує відносний шлях у файловій системі Magento 2, і якщо ні, він примушує кореня Magento 2 до. це. У моєму випадку модуль живе в окремому репо, /git/Aтоді як живе Magento, /site/Bі ця поведінка перевіряє наявність шаблону PHTML в /site/B/git/A.

Коротше кажучи: шаблони PHTML, що живуть поза кореневою файловою системою Magento 2, не вибираються, незалежно від включеного параметра "Конфігурація системи" "Дозволити посилання". Здається, що налаштування працює, але лише в тому випадку, якщо джерело симпосилання все ще знаходиться у файловій системі Magento 2.

Хтось ще стикався з цим? Який був би найкращий спосіб впоратися з розвитком у зовнішньому git repo?


50/50 помилка / функція. Я кажу, подайте проблему .
орієнтири

@benmarks Це відомий випуск, який має проблему, дивіться мою відповідь
Олексій Паляруш

Відповіді:


9

Хакітське вирішення, якщо ви використовуєте сховище шляху композитора для свого модуля.

У registration.phpсайті:

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

Це зареєструє ваш модуль під символізованим шляхом у кореневому директі Magento постачальника замість його реального шляху.


1
Це рішення працювало для мене, поки я не перейшов до Magento 2.3 (я отримую помилку "Недійсний файл шаблону ..."). Будь-яка ідея, як її вирішити?
Піні

Вибач, ні. Ви впевнені, що це працює, коли ви не використовуєте symlink? Якщо так, то вам доведеться налагоджувати, як M2.3 завантажує шаблони. Може, відкрити ще одне питання?
fsw

Це працює без симпосилання.
Піні

Я використовую Vagrant під час розробки. Я посилаюсь /vagrant/app/code/Vendor/на /var/www/shop/app/code/Vendor. Це вирішило це для мене!
BugHunterUK

Я повернувся. Це рішення не працює. Коли я використовував це для позначення коду модуля, маршрути адміністратора для мого модуля не працюватимуть. Я підтвердив це, видаливши симпосилання та скопіювавши файли в каталог додатків / кодів. Потім плагін працював. Ви можете підтвердити, створивши цей модуль і позначивши його: devdocs.magento.com/guides/v2.3/ext-best-practices/… ... ви отримаєте ту саму проблему, що і я.
BugHunterUK

4

Слід також мати можливість маніпулювати register.php, щоб вказати на корінь свого розробника.

Щоб переконатися, що він завантажується, вам доведеться виконати register.php десь у вашому завантажувальному процесі.

Найпростіший спосіб (не встановлюючи його через композитор) - додати його вручну до постачальника / композитора / autoload_files.php.

Я також думав про те, щоб написати модуль для цього. Цей модуль також може бути корисним для тестових середовищ інтеграції (для додавання та видалення модулів на ходу, не копіюючи їх кудись).

=== ОНОВЛЕННЯ ===

до цього моменту я написав модуль: http://github.com/davidverholen/magento2-dynamic-component-registry

також я думаю, що має бути можливість з'єднати модулі за допомогою відносних символьних посилань


3

Можна ввімкнути / дозволити посилання посилання через Магазини => Конфігурація => Розширений => Розробник => Налаштування шаблону (як і в Magento 1.x):

Параметр конфігурації

(Я не перевіряв, чи працює цей параметр)

Також ви можете використовувати підмодулі, таким чином вам не потрібні символьні посилання.

Для розробки я розробляю модулі в окремому каталозі і використовую PHPStorm, щоб скопіювати їх у мою розробку Magento 2.


1
Дякую. Налаштування, про яке я згадував, насправді було "Дозволити посилання" у розділі "Налаштування шаблону". Це добре працює під Magento 1.x, але тепер під Magento 2, файли повинні бути в корені Magento, так що не де-небудь у файловій системі. У будь-якому випадку, я буду добре - напевно, буду використовувати підмодулі :)
Jisse Reitsma

Jisse, лише думка ... Ви також можете використовувати композитор для збирання окремих модулів, коли ви створюєте артефакти побудови, що, як правило, уникає деяких проблем, з якими ви можете зіткнутися з підмодулями git, хоча це може додавати складності вашої збірки. процес. AFAIK, це рекомендований спосіб Magento для вирішення ситуації.
Bryan 'BJ' Hoffpauir Jr.

Дякую, параметри PHPStorm вже вирішили це для мене, але як зазначав @ alex-paliurush, є деякі сценарії, коли вирішення проблем просто не працює. Я замість цього додам PR.
Джиссі Рейцма

Дякую Брайану і за вашу пропозицію. Однак композитор ідеально підходить для роботи з місцями виробництва, але я шукав кращий спосіб розробити спеціальні модулі. Композитор ще не повинен грати, тому що це спосіб розповсюдження коду, який мені потрібно розробити в першу чергу в Magento 2, тому композитор завжди покладається на різні завдання. Попри це, PhpStorm (та інші IDE) вже пропонують рішення для цього. Тож єдине питання, що залишається, - це те, що виробничі майданчики страждають від цього обмеження символічного зв’язку, і тоді ваші аргументи
підштовхують

3

Якщо ви розробляєте використання PHP Storm, просто скопіюйте друге сховище в корінь проекту Magento. Потім створіть необхідні посилання для включення модуля. PHP Storm буде розглядати цей проект як багатокореневе і розпізнає обидва сховища. Ви можете вибирати між синхронними та асинхронними (за замовчуванням) стратегіями управління сховищами .

Ця проблема також виникає, коли EE (або будь-який інший модуль) пов'язаний з CE за допомогою символьних посилань. Першопричиною є те, що registration.phpобчислює шлях базового модуля як реальний шлях до каталогу (у вашому випадку він знаходиться поза проектом Magento). Ось чому відносний шлях обчислюється неправильно, і тоді абсолютний шлях також неправильний. Якщо друге сховище буде розміщено під коренем Magento, відносний шлях вказував би на реальний шлях до файлу (а не на посилання), але він все одно знайдеться, тому все буде працювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.