无效的模板文件magento2.3.0


13

我最近在本地wamp机器中安装了magento最新版本,即Magento 2.3.0, 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'

对你有用吗?
罗汉·哈帕尼

仍然没有工作,所有的扩展都在那里。
MageLerner

Answers:


37

是的,这是Windows的问题。Windows使用“ \”作为分隔符,数组“目录”包含以“ /”作为分隔符的条目,因此检查将始终失败。因此,您需要通过替换核心文件中的分隔符来解决此问题:

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

函数isPathInDirectories替换isPathInDirectories函数中的以下代码

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

这是一个非常普遍的问题,许多人不知道Magento并不正式支持Windows服务器!为了使它可以在Windows计算机上工作,需要进行一些技巧和非官方的修改(例如此修改),如果您访问下面的链接“ Magento 2.3.x技术堆栈要求”,则可以看到唯一受支持的操作系统是“ Linux x86-64”。devdocs.magento.com/guides/v2.3/install-gde/…–
Yacoub

对于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特有的问题。


6

Magento 2.3不支持Windows。您可以在这里找到我的解决方案:在此处 输入链接说明


2
它不支持Windows没有任何意义,但是具有如此简单的“修复”。
RT

3

这不仅是Magento 2.3.0的核心问题,而且我在Magento 2.2.7中也面临这个问题。为了使代码在Windows上运行而不是使用realpath,只需使用传递给方法的$ 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反斜杠scape,这可能行不通。您必须做两次反斜杠才能明确告诉PHP它在这里不是在处理新行,而是在反斜杠。


1

请注意,它应该是双斜杠,即“ \\”

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

1

如前所述,问题是Windows兼容性。但是我建议对它进行一些更改,以使其即使在迁移系统时也可以工作,例如,在Windows上进行本地开发,然后在Linux服务器上进行部署。因此,仅当您在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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.