[英]TYPO3: ViewHelper cannot be found
我目前正面臨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">
我在“作曲家模式”中使用 TYPO3,在安裝的根目錄下有一個“ composer.json ”文件和一個用於特定擴展名的“ composer.json ”文件。 在主要的“ composer.json ”文件中,我有以下幾行:
"repositories": {
"website": {
"type": "path",
"url": "sources/website",
"options": {
"symlink": true
}
},
...
}
...
"require": {
"domain/website": "@dev",
}
...
因此,擴展名設置為本地 package。
我的擴展的“ 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 64bit和PHP 7.0.33的Windows 10環境。
我注意到的另一件事是:當我運行composer update
時,當涉及到我的 package 時,我收到以下錯誤:
[RuntimeException]
Package domain/website cannot install to "C:\wamp64\www\mysite\sources\website" inside its source at "C:\wamp64\www\mysite\sources\website"
我不知道它是否相關,但它可以給出提示。 我想到了權限問題,但一切似乎都很好。
我們對其他項目有相同的設置,而且效果很好,所以我真的沒有得到我想念的東西。 除了“ Classes ”目錄中的內容之外,一切正常。
我發現的另一件事,正如克勞斯·杜 ( Claus Due ) 在下面所建議的那樣,如果我嘗試執行以下操作,則會收到一條錯誤消息,指出找不到 class:
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);
I also noticed that my extension is completely missing in the files " autoload_classmap.php ", " autoload_psr4.php " and " autoload_static.php " at the root of the installation (" ./vendor/composer "). 即使我 composer dump-autoload -o
,它也不會出現。 “ installed.json ”文件和“ composer.lock ”文件中也沒有引用它。
有人知道這個問題嗎? 任何幫助將非常感激。
提前謝謝了。
此致,
只是因為絕望,我試圖重做
rm -rf vendor
rm -rf htdocs\typo3conf\ext
composer clearcache
composer install
第n次......問題解決了!
這可能是區分大小寫的文件系統的問題 - 因為它可以在其他機器上運行,但不能在您自己的機器上運行。 如果列出了 class,並且文件名正確,並且可以加載文件 - 那么 ViewHelper 當然應該解決。
為了加載 class,TYPO3 在撰寫模式下完全依賴作曲家 class 加載,無需進行特殊處理。 但是,預期的 class 名稱是根據您提供的“uri”(ns 標識符,不是真正的 uri)生成的。
如果您明確指定 class 名稱,您也許可以通過檢查 class 是否可以在其他地方加載來確認這一點。 如果失敗,原因很清楚:不知何故,您的 class 文件未加載,或者 class 中的命名空間或 class 名稱錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.