Sou desenvolvedor e mantenedor do projeto CiviCRM. Estamos tentando criar uma versão do Drupal 8 CiviCRM e percorremos um longo caminho. Estamos batendo nossas cabeças contra nossos teclados coletivos, tentando descobrir um grande bloqueador para o projeto.
O CiviCRM usa o Symfony há algum tempo, e a versão incluída é diferente da que acompanha o Drupal.
Podemos instalar o CiviCRM com o Drupal 8, mas após a instalação, não podemos instalar nenhum outro módulo do Drupal.
Eu acredito que tudo se resume a uma situação em que, de alguma forma, a versão CiviCRM do Symfony carrega antes da versão Drupal, e isso causa problemas.
Alguém conhece um módulo do Drupal 8 que inclui uma versão diferente do Symfony do que a que acompanha o Drupal?
Recentemente, deparei-me com o projeto Ludwig. Este módulo permite o registro de espaços para nome em uma classe que se estendeServiceProviderBase
.
Seria possível para a versão Drupal 8 do módulo CiviCRM incluir um arquivo CivicrmServiceProvider.php, que define uma CivicrmServiceProvider
classe e um register()
método que adiciona um espaço para nome do contêiner para permitir que isso funcionasse?
Muitos arquivos do CiviCRM têm use
instruções como Drupal começando com Symfony, como aqui .
Na verdade, colocamos o CiviCRM Core na pasta doc_root / libraries do Drupal e usamos o módulo de bibliotecas.
Este é o repositório para o módulo 8.x do CiviCRM Drupal , se alguém quiser ver o que conseguimos até agora. Se alguém tiver o elixir mágico para isso, posso dizer que haveria muitas pessoas felizes em nossa comunidade. Então, se você sabe como nos ajudar, por favor.
O CiviCRM é instalado e as páginas do CiviCRM funcionam. O que não funciona é que, após a instalação do CiviCRM, não podemos instalar outros módulos na página admin / modules. Tanto quanto sei, é a única coisa que está quebrada. A instalação de módulos com o Drush, após a instalação do CiviCRM, funciona.
Tentar instalar outro módulo após a instalação do CiviCRM causa o seguinte erro:
Erro fatal do PHP: Ligue para o método indefinido Symfony \ Component \ DependencyInjection \ Definition :: setFactory () em /var/www/html/civi-for-d8/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php na linha 206
Isso está no Drupal 8.3.5. Tentar instalar o CiviCRM for Drupal 8 em uma instância limpa do Drupal 8.4-dev causa o seguinte erro:
Drupal \ Component \ Serialization \ Exception \ InvalidDataTypeException: o indicador reservado "@" não pode iniciar um escalar simples; é necessário citar o escalar na linha 8 (próximo a "argumentos: [@string_translation, @ civicrm.page_state]"). em Drupal \ Component \ Serialization \ YamlSymfony :: decode () (linha 40 de /var/www/html/drupal84/core/lib/Drupal/Component/Serialization/YamlSymfony.php).
Respostas:
Então, acho que se o CiviCRM fosse instalado no Drupal 8 via compositor (ou seja,
composer require civicrm/civicrm-core
na raiz do Drupal) e o uso do Symfony pelo CiviCRM fosse compatível com o Symfony 2.8 ou 3.x (ou seja, sem a funcionalidade obsoleta), isso poderia funcionar.Isso instalaria tudo no diretório de fornecedores do Drupal, em vez de ter dois, e isso significaria que o CiviCRM usaria a versão do Symfony no Drupal 8. Mas se o CiviCRM fosse compatível com as versões posteriores do Symfony (mesmo que empacotasse uma versão mais antiga do Drupal 6 e 7 e outros CMSs) deve ficar bem.
Eu acho que?ATUALIZADO: Sim, funciona - eu tentei. :-) Eu originalmente publiquei o abaixo na fila de problemas do CiviCRM ( CRM-17652 ), mas publiquei novamente aqui para garantir a integridade.
A grande ideia:
Como o compositor é bastante novo para muitas pessoas, vou tentar ir passo a passo, de alguns compositores de alto nível até uma maneira que poderia ser feita no CiviCRM:
^2.4.3
que indica um mínimo de 2.4.3 e até (mas não incluindo) 3.0.0)^2.5
em seu compositor.json, o que significa que é compatível com as versões 2.5.0 até (mas não incluindo) 3.0.0composer require civicrm/civicrm-core
para exigir a biblioteca do CiviCRM e todas as suas dependências. Se o CiviCRM for compatível com o Symfony 2.8 (como usado no Drupal 8.3.x), tudo será instalado e funcionará bem, usando o único Symfony 2.8 do Drupal. Todas as dependências acabam no diretório de fornecedores do Drupal.A proposta:
Para CMSs baseados em compositores, eu realmente acho que esse é o caminho certo. Embora esse problema atualmente esteja afetando o Symfony e o Drupal, como a comunidade PHP começa a usar cada vez mais bibliotecas de terceiros por meio do compositor, isso pode muito bem afetar outros CMSs com outros conflitos de versão.
Algum código de trabalho para testar:
Então, como prometido, eu realmente consegui que isso funcionasse em um grau limitado :-) Estou aproveitando totalmente isso da perspectiva do Drupal / Composer / Symfony - eu não tenho muita experiência com o CiviCRM, então provavelmente há algumas melhores maneiras de executar meu processo abaixo. Congratulo-me com qualquer conselho!
git clone https://github.com/dsnopek/civicrm-drupal.git --branch composer-library
/admin/modules
) e instale o módulo CiviCRMdrush cr
)Depois de tudo isso, o CiviCRM está usando o Symfony 2.8 do Drupal e as dependências no diretório de fornecedores do Drupal, e não está carregando nada do seu próprio diretório de fornecedores. Huzzah!
Eu testei habilitando o módulo "Telefone", que falhou antes dessas alterações (veja minhas etapas para reproduzir ), mas funciona bem com elas. :-)
fonte
Eu não acho que isso seja possível.
O Drupal 8.4 já mudou para o Symfony 3, embora ainda haja discussões semelhantes relacionadas ao drush, que tem o mesmo problema. veja Drush 8.x não instala Drupal 8.4.x e Drush mestre não instalar o Drupal 8.3.x e componentes Symfony são atualizados para 3.2.6
Não é possível carregar duas versões diferentes do symfony, você interrompe sua integração ou o Drupal. Talvez o symfony3 ainda não esteja na versão 8.4, mas o suporte de segurança do symfony2 terminará antes do suporte de segurança do Drupal8, portanto, em algum momento, teremos que mudar.
fonte
Teoricamente, os únicos problemas aqui são o local do arquivo e o namespace da classe. Infelizmente, as únicas ferramentas que conheço no compositor para fazer isso não permitem que você especifique por VERSION, apenas por nome do pacote.
Você já tentou configurá-lo como um carregador automático completamente separado?
fonte