我目前正面临着TYPO3 8.7的一种奇怪行为。更确切地说,我所做的不是在我的机器上工作,而是在其他机器和我们的QA环境中工作。
我正在构建一个扩展,在这里我需要一个简单的ViewHelper。不幸的是,每次我尝试使用我的ViewHelper时,我都会得到以下异常:
#1407060572: Fluid parse error in template Default_action_Default_3595d4917583aa65277b432499e522ff39c573c7, line 48 at character 1. Error: The ViewHelper "<website:string.idFromTitle>" could not be resolved. Based on your spelling, the system would load the class "Domain\Website\ViewHelpers\String\IdFromTitleViewHelper", however this class does not exist. (error code 1407060572). Template source chunk: {title -> website:string.idFromTitle(string: '{title}') -> v:variable.set(name: 'targetId')} <div class="alternative-content-lightbox-fce"> <div class="header"> <a href="#" class="lightbox-trigger" data-target="{targetId}">{linkTitle}</a> <h1>{title}</h1> </div> <div class="main-content">我在"Composer模式“中使用TYPO3,安装的根部有一个"composer.json”文件,而特定的扩展名是"composer.json“文件。在主"composer.json“文件中,我有以下几行:
"repositories": {
"website": {
"type": "path",
"url": "sources/website",
"options": {
"symlink": true
}
},
...
}
...
"require": {
"domain/website": "@dev",
}
...因此,扩展被设置为本地包。
我的扩展名的"composer.json“文件包含以下行:
"autoload": {
"psr-4": {
"Domain\\Website\\": "Classes"
}
}在"autoload_classmap.php“文件中,我可以看到以下一行:
return array(
'Domain\\Website\\ViewHelpers\\String\\IdFromTitleViewHelper' => $baseDir . '/Classes/ViewHelpers/String/IdFromTitleViewHelper.php'
);"autoload_static.php“文件有以下一行:
public static $classMap = array (
'Domain\\Website\\ViewHelpers\\String\\IdFromTitleViewHelper' => __DIR__ . '/../..' . '/Classes/ViewHelpers/String/IdFromTitleViewHelper.php',
);最后,"autoload_psr4.php“文件包含以下行:
return array(
'Domain\\Website\\' => array($baseDir . '/Classes'),
);所以我想我的文件是自动记录的。ViewHelper可以在目录"Classes/ViewHelpers/String“中找到,它看起来如下:
<?php
namespace Domain\Website\ViewHelpers\String;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
class IdFromTitleViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper
{
public function initialize()
{
}
public function render($string)
{
$id = trim($string);
$id = strtolower($id);
$id = str_replace(' ', '', $id);
$id = preg_replace('/[^A-Za-z0-9\-]/', '', $id);
$id .= uniqid();
return $id;
}
}当我使用ViewHelper时,我会这样做:
xmlns:f="http://typo3.org/ns/TYPO3/Fluid/ViewHelpers"
f:schemaLocation="https://fluidtypo3.org/schemas/fluid-master.xsd"
xmlns:flux="http://typo3.org/ns/FluidTYPO3/Flux/ViewHelpers"
flux:schemaLocation="https://fluidtypo3.org/schemas/flux-master.xsd"
xmlns:v="http://typo3.org/ns/FluidTYPO3/Vhs/ViewHelpers"
v:schemaLocation="https://fluidtypo3.org/schemas/vhs-master.xsd"
xmlns:website="http://typo3.org/ns/Domain/Website/ViewHelpers"
data-namespace-typo3-fluid="true">
...
<f:section name="Main">
{title -> website:string.idFromTitle(string: '{title}') -> v:variable.set(name: 'targetId')}
<div class="alternative-content-lightbox-fce">
<div class="header">
<a href="#" class="lightbox-trigger" data-target="{targetId}">{linkTitle}</a>
<h1>{title}</h1>
</div>
<div class="main-content">
<f:format.html>{mainContent}</f:format.html>
</div>
<div id="{targetId}" class="alternative-content">
<f:format.html>{alternativeContent}</f:format.html>
</div>
</div>
</f:section>不幸的是,它不能在我的机器上工作,但它在其他地方工作。我对放置在"Classes/ViewHelpers“中的任何其他ViewHelper也有同样的问题,就像忽略了"Classes”目录中的内容一样。
我检查了我的TYPO3配置、php.ini文件和环境变量。我清理了TYPO3和Composer的缓存上千次。我完全重新安装了TYPO3。起初,我使用的是TYPO3 8.7.27,所以我将安装更新为8.7.28,但是它没有改变任何东西。我甚至用另一个数据库交换了数据库,以防万一。
我的环境是使用Wamp 3.1.9 64位和PHP 7.0.33的Windows 10环境。
我注意到的另一件事是:当我运行一个composer update时,当涉及到我的包时,我会得到以下错误:
[RuntimeException]
Package domain/website cannot install to "C:\wamp64\www\mysite\sources\website" inside its source at "C:\wamp64\www\mysite\sources\website"我不知道它是否相关,但它可以给出一个提示。我想到了权限问题,但一切似乎都很好。
我们有相同的设置为其他项目,它的工作非常好,所以我没有真正得到我错过的东西。除了“类”目录中的内容之外,一切都很好。
我注意到的另一件事是,正如克劳斯在下面建议的那样,如果我尝试这样做的话,我会发现一个错误,说找不到这个类:
use Domain\Website\ViewHelpers\String;
$foo = new IdFromTitleViewHelper();
print_r($foo);但是,如果我执行以下操作(例如),则可以工作:
include __DIR__ .'/../../../Classes/ViewHelpers/String/IdFromTitleViewHelper.php';
$foo = new Domain\Website\ViewHelpers\String\IdFromTitleViewHelper();
print_r($foo);我还注意到,在安装根目录“./autoload_classmap.php/composer”的"autoload_psr4.php“和"autoload_static.php”文件中,我的扩展名完全丢失了。即使我作曲dump-autoload -o,它也不会出现。它也没有在"installed.json“文件和"composer.lock”文件中引用。
有人知道这个问题吗?任何帮助都将不胜感激。
在此之前,非常感谢您。
诚挚的问候,
解决方案
就因为我绝望,我试着重做
rm -rf vendor
rm -rf htdocs\typo3conf\ext
composer clearcache
composer install这是第九次.问题解决了!
发布于 2019-10-23 10:09:04
对于区分大小写的文件系统来说,这可能是个问题--因为它可以在其他机器上工作,而不是在您自己的机器上工作。如果列出了类,并且文件名是正确的,并且可以加载文件,那么ViewHelper当然应该解析。
没有特殊的处理来加载类,TYPO3在组合模式下完全依赖于composer类的加载。但是,预期的类名是根据您提供的"uri“(ns标识符,而不是真正的uri)生成的。
如果您显式地指定类名,也许可以通过检查类是否可以加载到其他地方来确认这一点。如果失败,原因很清楚:不知何故,类文件没有加载,或者类中的类有错误的命名空间或类名。
https://stackoverflow.com/questions/58519548
复制相似问题