Invalid template file magento2.3.0
-
06-02-2021 - |
题
I have recently installed magento latest version i.e. Magento 2.3.0 in local wamp machine with php 7.2.4
Installed it using command line interface.
But when i tired to run it show me error like
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'
解决方案
Yes, This is the problem with windows. Windows uses "\" as separator, the array "directories" contains entries with "/" as separator, so the check will always fail. So you need to fix this by replacing the separator in core file:
Magento\Framework\View\Element\Template\File\Validator
function isPathInDirectories replace below code in isPathInDirectories function
$realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));
其他提示
For me, solution worked is by going to the file \vendor\magento\framework\View\Element\Template\File\Validator.php and replacing the below function definition as below:
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: This is windows specific issue.
Magento 2.3 does not support windows. You can find my solution here: enter link description here
In Magento 2.2.9 replace /vendor/magento/framework/View/Element/Template/File/Validator.php isPathInDirectories function code with this code
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;
}
It's the core issue of not just Magento 2.3.0, but I faced that problem in Magento 2.2.7 as well. In order to make the code work on windows instead of using realpath just use the $path argument passed to the method
Go to path /vendor/magento/framework/View/Element/Template/File/Validator.php and instead of the line
if (0 === strpos($realPath, $directory)) {
use
if (0 === strpos($path, $directory)) {
Or follow this discussion https://github.com/magento/magento2/issues/19480
As mentioned the issue is Windows compatability. But I would recommend to change it a bit differently to work even when migrating systems, e.g. for local development on Windows and later deployment on a Linux server. So that only in case you are operating on Windows you will adjust the path.
In
\vendor\magento\framework\View\Element\Template\File\Validator.php
in
function isPathInDirectories()
replace
$realPath = $this->fileDriver->getRealPath($path);
with:
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);
This probably happens when developing under Windows System.
Go to line 140 in file Path /vendor/magento/framework/View/Element/Template/File/Validator.php Replace this code of line
$realPath = $this->fileDriver->getRealPath($path);
With
$realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));
Beware of this line of code
$realPath = str_replace('\', '/', $this->fileDriver->getRealPath($path));
This won't probably work because of the php backslash scape. you have to do double backslash to tell PHP explicitly that it is not dealing with new line here but a backslash.
Please See that,It should be double slash i.e "\\"
$realPath = str_replace('\\\', '/', $this->fileDriver->getRealPath($path));
In my situation I set only one colon in xml file in path for template like this Vendor_Modulename:product/view/template.phtml but the the write way is to Vendor_Modulename::product/view/template.phtml. It may be invisible error