無効なテンプレートファイルmagento2.3.0


13

最近、magentoの最新バージョン、つまりMagento 2.3.0をローカルwampマシンにインストールしました。 php 7.2.4

コマンドラインインターフェイスを使用してインストールしました。

しかし、実行に疲れたとき、次のようなエラーが表示されます

Exception #0 (Magento\Framework\Exception\ValidatorException): Invalid template file: 'D:/wamp64/www/mage23/vendor/magento/module-theme/view/frontend/templates/page/js/require_js.phtml' in module: '' block's name: 'require.js'

それはあなたのために働いていますか?
Rohan Hapani

すべての拡張がまだ機能していないわけではありません。
MageLerner 2018年

回答:


36

はい、これはウィンドウの問題です。Windowsは区切り文字として「\」を使用し、配列「ディレクトリ」には区切り文字として「/」を含むエントリが含まれるため、チェックは常に失敗します。したがって、コアファイルのセパレーターを置き換えることでこれを修正する必要があります。

Magento\Framework\View\Element\Template\File\Validator

isPathInDirectories関数の以下のコードを関数isPathInDirectoriesで置き換えます

$realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));

これは非常に一般的な問題です。多くの人は、Magentoが公式にWindowsサーバーをサポートしていないことを認識していません。Windowsマシンで動作させるために、ハッキングやこのような非公式な変更を行う必要があります。以下のリンク「Magento 2.3.xテクノロジースタックの要件」にアクセスすると、サポートされているOSが唯一であることがわかります。 「Linux x86-64」。devdocs.magento.com/guides/v2.3/install-gde/...
ヤコブOweis

Windowsシステムの場合、実際のコードはどうあるべきですか?私は最初に「\」行を試していますが、この単一のバックスラッシュは許可されません...
Flutterer

さて、彼らは正式にWindowsをサポートしていませんがDIRECTORY_SEPARATOR、他の世界と同じように使用していて、Windowsでそれを使用することの唯一のように見えるこの特定の問題がないのではないでしょうか?
ACJ

10

私にとって、解決策は、ファイル\ vendor \ magento \ framework \ View \ Element \ Template \ File \ Validator.phpに移動し、以下の関数定義を以下のように置き換えることです。

> protected function isPathInDirectories($path, $directories) {
>     if (!is_array($directories)) {
>         $directories = (array)$directories;
>     }
>     $realPath = $this->fileDriver->getRealPath($path);
>     $realPath = str_replace('\\', '/', $realPath); // extra code added
>     foreach ($directories as $directory) {
>         if (0 === strpos($realPath, $directory)) {
>             return true;
>         }
>     }
>     return false; }

PS:これはWindows固有の問題です。



3

これはMagento 2.3.0だけでなく、Magento 2.2.7でもその問題に直面しました。realpathを使用する代わりにWindowsでコードを機能させるには、メソッドに渡された$ path引数を使用します

パスの/vendor/magento/framework/View/Element/Template/File/Validator.phpに移動し、行の代わりに

if (0 === strpos($realPath, $directory)) {

使用する

if (0 === strpos($path, $directory)) {

または、このディスカッションhttps://github.com/magento/magento2/issues/19480に従ってください


2

Magento 2.2.9では、/ vendor / magento / framework / View / Element / Template / File / Validator.php isPathInDirectories関数コードをこのコードに置き換えます

protected function isPathInDirectories($path, $directories)
{
    if (!is_array($directories)) {
        $directories = (array)$directories;
    }
    foreach ($directories as $directory) {
        if (0 === strpos(str_replace('\\', '/', $this->fileDriver->getRealPath($path)), $directory)) {
            return true;
        }
    }
    return false;
}

1

これはおそらく、Windowsシステムで開発しているときに起こります。

ファイルパス/vendor/magento/framework/View/Element/Template/File/Validator.phpの140行目に移動します。この行のコードを置き換えます

$realPath = $this->fileDriver->getRealPath($path);

$realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));

このコード行に注意してください

$realPath = str_replace('\', '/', $this->fileDriver->getRealPath($path));

PHPのバックスラッシュスケープのため、これはおそらく機能しません。ここでは改行ではなくバックスラッシュを処理していることをPHPに明示的に伝えるには、2つのバックスラッシュを実行する必要があります。


1

それを見てください、それはダブルスラッシュ、すなわち「\\」であるべきです

$realPath = str_replace('\\\', '/', $this->fileDriver->getRealPath($path));

1

前述のとおり、問題はWindowsの互換性です。ただし、システムを移行する場合でも機能するように少し異なるように変更することをお勧めします。したがって、Windowsで操作している場合にのみ、パスを調整します。

\ vendor \ magento \ framework \ View \ Element \ Template \ File \ Validator.php

関数isPathInDirectories()

取り替える

$realPath = $this->fileDriver->getRealPath($path);

で:

a)PHP> = 7.2:

if (PHP_OS_FAMILY === 'Windows')
  $realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));
else
  $realPath = $this->fileDriver->getRealPath($path);

b)PHP <7.2:

if (strtolower(substr(PHP_OS, 0, 3)) === 'win')
  $realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));
else
  $realPath = $this->fileDriver->getRealPath($path);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.