Я разработчик и сопровождающий проекта CiviCRM. Мы пытались создать версию CiviCRM для Drupal 8 и прошли долгий путь. Мы бьем себя по голове о наших коллективных клавиатурах, пытаясь стать главным блокировщиком для проекта.
CiviCRM какое-то время использовал Symfony, и включенная версия отличается от той, которая поставляется с Drupal.
Мы можем установить CiviCRM с Drupal 8, но после его установки мы не сможем установить любой другой модуль Drupal.
Я полагаю, что это сводится к ситуации, когда версия Symfony на CiviCRM загружается раньше, чем версия Drupal, и это вызывает проблемы.
Кто-нибудь знает модуль Drupal 8, который включает в себя версию Symfony, отличную от той, которая поставляется с Drupal?
Недавно я наткнулся на проект Людвига. Этот модуль позволяет регистрировать пространства имен в расширяемом классеServiceProviderBase
.
Возможно ли, чтобы версия Drupal 8 модуля CiviCRM включала файл CivicrmServiceProvider.php, который определяет CivicrmServiceProvider
класс, и register()
метод, который добавляет пространство имен контейнера, чтобы это работало?
Многие файлы CiviCRM имеют use
такие выражения, как Drupal, начиная с Symfony, как здесь .
Фактически мы помещаем CiviCRM Core в папку Drupal doc_root / library и используем модуль библиотеки.
Это репозиторий для версии 8.x модуля CiviCRM Drupal , если кто-то хочет взглянуть на то, что мы получили до сих пор. Если у кого-то есть для этого волшебный эликсир, я могу сказать, что в нашем сообществе будет много счастливых людей. Так что, если вы знаете, как помочь нам, пожалуйста.
CiviCRM устанавливает, и страницы CiviCRM работают. Что не работает, так это то, что после установки CiviCRM мы не можем устанавливать другие модули через страницу admin / modules. Насколько я знаю, это единственное, что сломано. Также установка модулей с Drush, после установки CiviCRM, работает.
Попытка установить другой модуль после установки CiviCRM приводит к следующей ошибке:
Неустранимая ошибка PHP: вызов неопределенного метода Symfony \ Component \ DependencyInjection \ Definition :: setFactory () в /var/www/html/civi-for-d8/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php в строке 206
Это в Drupal 8.3.5. Попытка установить CiviCRM для Drupal 8 в чистый экземпляр Drupal 8.4-dev приводит к следующей ошибке:
Drupal \ Component \ Serialization \ Exception \ InvalidDataTypeException: зарезервированный индикатор "@" не может запустить простой скаляр; вам нужно заключить скаляр в строку 8 (рядом с «arguments: [@string_translation, @ civicrm.page_state]»). в Drupal \ Component \ Serialization \ YamlSymfony :: decode () (строка 40 из /var/www/html/drupal84/core/lib/Drupal/Component/Serialization/YamlSymfony.php).
Ответы:
Итак, я думаю, что если CiviCRM был установлен в Drupal 8 через composer (то есть
composer require civicrm/civicrm-core
в корне Drupal), и использование CiviCRM Symfony было бы совместимо с Symfony 2.8 или 3.x (то есть без использования устаревших функций), это могло бы работать.Это позволит установить все в каталоге вендоров Drupal, а не в два, и это будет означать, что CiviCRM будет использовать версию Symfony в Drupal 8. Но если CiviCRM будет совместим с более поздними версиями Symfony (даже если он будет включать более старую версию для Drupal) 6 & 7 и другие CMS) это должно быть хорошо.
Я думаю?ОБНОВЛЕНО: Да, это работает - я попробовал это. :-) Первоначально я разместил нижеприведенное в очереди на выпуск CiviCRM ( CRM-17652 ), но повторно опубликовал здесь для полноты.
Большая идея:
Поскольку композитор является довольно новым для многих людей, я попытаюсь шаг за шагом перейти от какого-либо высокоуровневого композитора к одному способу, которым это можно сделать в CiviCRM:
^2.4.3
которых указано минимум от 2.4.3 и до (но не в том числе) 3.0.0)^2.5
в своем composer.json, что означает, что он совместим с версиями 2.5.0 до (но не включая) 3.0.0composer require civicrm/civicrm-core
запрашивает библиотеку CiviCRM и все ее зависимости. Если CiviCRM совместим с Symfony 2.8 (как в Drupal 8.3.x), все будет установлено и будет работать нормально, используя единственный Symfony 2.8 от Drupal. Все зависимости попадают в каталог поставщиков Drupal.Предложение:
Для CMS на основе композиторов я действительно считаю, что это правильный путь. Хотя эта проблема в настоящее время затрагивает Symfony и Drupal, так как сообщество PHP начинает использовать все больше и больше сторонних библиотек через composer, это может очень хорошо повлиять на другие CMS с другими конфликтами версий.
Некоторый рабочий код для тестирования:
Итак, как и было обещано, я действительно заставил это работать в ограниченной степени :-) Я полностью прихожу к этому с точки зрения Drupal / Composer / Symfony - у меня нет тонны опыта CiviCRM, так что, вероятно, есть некоторые Лучшие способы сделать мой процесс ниже. Я приветствую любые советы!
git clone https://github.com/dsnopek/civicrm-drupal.git --branch composer-library
/admin/modules
) и установите модуль CiviCRM.drush cr
)После всего этого CiviCRM использует Symfony 2.8 из Drupal и зависимости в каталоге вендоров Drupal и ничего не загружает из своего каталога вендоров. Ура!
Я протестировал включение модуля «Телефон», который не прошел до этих изменений (см. Мои шаги по воспроизведению ), но с ними работает нормально. :-)
источник
Я не думаю, что это возможно.
Drupal 8.4 фактически уже переключился на Symfony 3, хотя все еще существуют похожие обсуждения, связанные с drush, у которого есть та же проблема. см. Drush 8.x не устанавливает Drupal 8.4.x, а Drush master не устанавливает Drupal 8.3.x, а компоненты Symfony обновлены до 3.2.6
Невозможно загрузить две разные версии Symfony, либо вы нарушаете интеграцию, либо нарушаете Drupal. Возможно, symfony3 еще не будет в 8.4, но поддержка безопасности для symfony2 прекратится до поддержки безопасности в Drupal8, поэтому в какой-то момент нам придется переключиться.
источник
Теоретически единственными проблемами здесь являются местоположение файла и пространство имен класса. К сожалению, единственные инструменты, которые я знаю в composer, которые не позволяют вам указывать для VERSION, только для имени пакета.
Вы пытались настроить его как отдельный автозагрузчик?
источник