Arquivo de modelo inválido magento2.3.0

13

Eu instalei recentemente a versão mais recente do magento, ou seja, o Magento 2.3.0 em uma máquina wamp local com php 7.2.4

Instalei usando a interface da linha de comandos.

Mas quando eu cansei de executá-lo, mostre-me um erro como

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
fonte
Está funcionando para você?
Rohan Hapani
ainda não está funcionando todas as extensões existem.
MageLerner

Respostas:

36

Sim, este é o problema do Windows. O Windows usa "\" como separador, a matriz "diretórios" contém entradas com "/" como separador, portanto, a verificação sempre falha. Então, você precisa corrigir isso substituindo o separador no arquivo principal:

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

A função isPathInDirectories substitui o código abaixo na função isPathInDirectories

$realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));
Saurabh Dwivedi
fonte
Este é um problema muito comum. Muitas pessoas não sabem que o Magento não suporta oficialmente servidores Windows! alguns hacks e modificações não oficiais, como esta, precisam ser feitas para que funcionem em uma máquina Windows. Se você visitar o link abaixo "Requisitos da pilha de tecnologia Magento 2.3.x", poderá ver que o único SO suportado é "Linux x86-64". devdocs.magento.com/guides/v2.3/install-gde/…
Yacoub Oweis
para o sistema windows, qual deve ser o código real? Eu estou tentando '\' linha em primeiro lugar, mas esta barra invertida única não é permitida ...
Flutterer
Ok, entendo que eles não oferecem suporte oficial ao Windows, mas eles não poderiam usar apenas DIRECTORY_SEPARATORcomo o resto do mundo e não têm esse problema específico que parece ser a única coisa que funciona no Windows?
ACJ 25/02
10

Para mim, a solução trabalhada é ir para o arquivo \ vendor \ magento \ framework \ View \ Element \ Template \ File \ Validator.php e substituir a definição de função abaixo, como abaixo:

> 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: Este é um problema específico do Windows.

Tejas Vyas
fonte
6

Magento 2.3 não suporta janelas. Você pode encontrar minha solução aqui: insira a descrição do link aqui

Vincent
fonte
2
não faz sentido não suportar janelas, mas possui uma "correção" tão simples.
RT
3

É a questão principal não apenas do Magento 2.3.0, mas também enfrentei esse problema no Magento 2.2.7. Para fazer o código funcionar no Windows em vez de usar o caminho real, use o argumento $ path passado ao método

Vá para o caminho /vendor/magento/framework/View/Element/Template/File/Validator.php e em vez da linha

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

usar

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

Ou siga esta discussão https://github.com/magento/magento2/issues/19480

Abbas Naveed
fonte
2

No Magento 2.2.9, substitua o código de função /vendor/magento/framework/View/Element/Template/File/Validator.php isPathInDirectories por este código

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;
}
Sanaullah Ahmad
fonte
1

Isso provavelmente acontece durante o desenvolvimento no sistema Windows.

Vá para a linha 140 no arquivo Path /vendor/magento/framework/View/Element/Template/File/Validator.php Substitua este código de linha

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

Com

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

Cuidado com esta linha de código

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

Provavelmente não funcionará por causa da barra invertida do php. você tem que fazer uma barra invertida dupla para dizer ao PHP explicitamente que não está lidando com nova linha aqui, mas com uma barra invertida.

Mubo
fonte
1

Por favor, veja que, deve ser barra dupla, ou seja, "\\"

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

Como mencionado, o problema é a compatibilidade do Windows. Mas eu recomendaria alterá-lo de maneira um pouco diferente para funcionar mesmo durante a migração de sistemas, por exemplo, para desenvolvimento local no Windows e implantação posterior em um servidor Linux. Portanto, apenas no caso de você estar operando no Windows, você ajustará o caminho.

No

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

no

função isPathInDirectories ()

substituir

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

com:

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);
cristão
fonte