Magento 2では、シンボリックリンクを使用したモジュールのリンクは許可されていません


10

シンボリックリンクを使用してローカル開発モジュール(個別のgitリポジトリ)を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ます。

つまり、Magento 2ルートファイルシステムの外部にあるPHTMLテンプレートは、システム設定の[Symlinksを許可する]がオンになっているかどうかに関係なく、取得されません。設定は機能しているようですが、シンボリックリンクのソースがまだMagento 2ファイルシステム内にある場合のみです。

他の誰かがこれに遭遇しましたか?外部のgitリポジトリで開発を処理する最良の方法は何でしょうか?


50/50バグ/機能。私は問題を提出すると言います
ベンマークス、2015

@benmarksこれは既知の問題であり、解決策があります。私の回答を参照してください
Alex Paliarush、2015

回答:


9

モジュールにcomposerパスリポジトリを使用している場合のハックの回避策。

つまり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 2018

シンボリックリンクなしで動作しています。
ピニ

開発中はVagrantを使用します。にシンボリックリンク/vagrant/app/code/Vendor//var/www/shop/app/code/Vendorます。これで解決しました!
BugHunterUK

戻ってきました。このソリューションは機能しません。これを使用してモジュールコードのシンボリックリンクを作成すると、モジュールのadminhtmlルートが機能しなくなります。これを確認するには、シンボリックリンクを削除し、ファイルをapp / codeディレクトリにコピーします。その後、プラグインは機能しました。このモジュールを作成してシンボリックリンクすることで確認できます:devdocs.magento.com/guides/v2.3/ext-best-practices/… ...私と同じ問題が発生します。
BugHunterUK

4

また、registration.phpを操作して、開発ルートを指すようにすることもできます。

ロードされていることを確認するには、ブートストラッププロセスのどこかでregistration.phpを実行する必要があります。

最も簡単な方法(composer経由でインストールしない場合)は、手動でvendor / composer / autoload_files.phpに追加することです。

このためのモジュールを書くことも考えました。このモジュールは、統合テスト環境にも使用できます(モジュールをどこかにコピーせずにオンザフライで追加および削除するため)。

===更新===

今私はモジュールを書いた:http : //github.com/davidverholen/magento2-dynamic-component-registry

また、相対シンボリックリンクを使用してモジュールをリンクすることも可能だと思います


3

Stores => Configuration => Advanced => Advanced => Developer => Template Settings(Magento 1.xと同様)を介してシンボリックリンクを有効化/許可することができます:

構成オプション

(この設定が機能するかどうかはテストしていません)

また、サブモジュールを使用することもできます。これにより、シンボリックリンクは必要ありません。

開発では、別のディレクトリでモジュールを開発し、PHPStormを使用してMagento 2の開発用インストールにそれらをコピーします。


1
ありがとう。私が言及した設定は、確かに「テンプレート設定」の下の「シンボリックリンクを許可する」設定でした。Magento 1.xの下では問題なく動作しますが、現在Magento 2の下では、ファイルはMagentoルート内にある必要があるため、ファイルシステム上のどこにでも置く必要はありません。とにかく、私は大丈夫です-私はおそらくサブモジュールを使用するつもりです:)
Jisse Reitsma '26

Jisse、単なる考え...ビルドアーティファクトを生成するときにcomposerを使用して個別のモジュールをアセンブルすることもできます。これにより、gitサブモジュールで発生する可能性のあるいくつかの問題が回避されがちですが、ビルドの複雑さが増す可能性があります。処理する。私の知る限り、これは状況を処理するためのMagentoの推奨方法です。
ブライアン 'BJ'ホフパウアーJr.

おかげで、PHPStormのオプションで既に解決されていますが、@ alex-paliurushが指摘したように、回避策が機能しないシナリオがいくつかあります。代わりにPRを追加します。
Jisse Reitsma

ブライアンにもあなたの提案をありがとう。ただし、composerは本番サイトを扱う場合には最適ですが、カスタムモジュールを開発するためのより良い方法を探していました。Composerは、Magento 2内で最初に開発する必要のあるコードを配布する方法であるため、まだ機能していないはずです。そのため、composerは常にさまざまなコミットの背後にあります。そうは言っても、PhpStorm(および他のIDE)はすでにこれに対するソリューションを提供しています。したがって、残っている唯一の問題は、プロダクションサイトがこのシンボリックリンクの制限に悩まされていることです。それから、議論が
始まり

3

PHP Stormを使用して開発する場合は、2番目のリポジトリをMagentoプロジェクトのルートにコピーするだけです。次に、モジュールを有効にするために必要なシンボリックリンクを作成します。PHPストームはこのプロジェクトをマルチルートとして扱い、両方のリポジトリを認識します。同期および非同期(デフォルト)のリポジトリ管理戦略を選択できます。

この問題は、EE(またはその他のモジュール)がシンボリックリンクを使用してCEにリンクされている場合にも発生します。根本的な原因は、registration.phpベースモジュールのパスをディレクトリへの実際のパスとして計算することです(あなたの場合はMagentoプロジェクトの外にあります)。そのため、相対パスが正しく計算されず、絶対パスも正しく計算されません。2番目のリポジトリがMagentoルートの下に置かれている場合、相対パスは実際のファイルパス(シンボリックリンクではない)を指しますが、それでも検出されるため、すべてが機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.