TYPO3教程扩展,控制器不存在

7
我正在尝试开始使用TYPO3扩展,并遵循this教程来了解基础知识。
后端一切正常,但在前端出现错误:
“哎呀,发生了错误!代码:20170209104827c3b58d58 - {"exception":"exception 'ReflectionException' with message 'Class Tx_Inventory_Controller_InventoryController does not exist'”
我的文件与教程中的完全相同。我不知道是什么原因导致这种情况。我认为我在命名空间方面犯了一些愚蠢的错误,但它们似乎都是正确的。
控制器类如下所示,位于typo3conf/ext/inventory/Classes/Controller/
<?php
   namespace \MyVendor\Inventory\Controller;
   use \TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
   use \TYPO3\CMS\Core\Utility\GeneralUtility;
   use \MyVendor\Inventory\Domain\Model\Repository\ProductRepository;

   class InventoryController extends ActionController {
        public function listAction() {
                $productRepository = GeneralUtility::makeInstance(ProductRepository::class)
                $products = $productRepository->findAll();
                $this->view->assign('products', $products);
        }
   }
?>

请发布您的控制器文件typo3conf/ext/inventory/Classes/Controller/InventoryController.php的顶部吗?也许您的命名空间或类名中有错误的语法。确保已加载您的类,这些类不会自动加载,如果您只是创建/上传它。如果您添加新的PHP类文件,最好卸载/重新安装您的EXT:inventory。 - jokumer
感谢回复!我已将其添加到帖子中。 - Woeler
5个回答

10
在使用composer安装的TYPO3 V9(这里是9.4)中开发新扩展时,必须将autoload部分添加到中央根composer.json文件中。在此处找到它(德语)。按照OPs提到的教程的步骤会导致核心异常:
Core: Exception handler (WEB): Uncaught TYPO3 Exception: #1278450972:
  Class MyVendor\StoreInventory\Controller\StoreInventoryController does not exist.
  Reflection failed.

只要该扩展程序不是通过composer安装的,例如因为它是新开发的,composer就无法在扩展程序目录中找到相应的composer.json文件。因此,TYPO3无法在新扩展程序的Classes目录中找到任何类。要解决此问题,必须将自动加载配置添加到根composer.json中。只需将以下行放入安装基目录中的composer.json即可:
{
    "repositories": [
        { "type": "composer", "url": "https://composer.typo3.org/" }
    ],
    ...
    "autoload": {
        "psr-4": {
            "MyVendor\\StoreInventory\\": "public/typo3conf/ext/store_inventory/Classes/"
        }
    }
}

然后重新生成自动加载配置:

composer dumpautoload

你可能需要在后台也清除缓存。


非常感谢你!你的答案已经第二次救了我! - Clemens

4

看起来您的类没有自动加载。如果您不使用composer来生成自动加载,请查看您的typo3conf/autoload/autoload_classmap.php文件。

您应该能够找到与您的文件对应的条目。您将会看到是否存在路径错误。


3

去除反斜杠 - 尝试使用

<?php
namespace MyVendor\Inventory\Controller;

use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use MyVendor\Inventory\Domain\Model\Repository\ProductRepository;

class InventoryController extends ActionController {

    public function listAction() {
            $productRepository = GeneralUtility::makeInstance(ProductRepository::class)
            $products = $productRepository->findAll();
            $this->view->assign('products', $products);
    }
}

在注册插件时,请确保将Vendorname添加到扩展键中,详细请参见ext_tables.php,并将'MyVendor.'.$_EXTKEY编写为替代$_EXTKEY

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
    'MyVendor.'.$_EXTKEY,
    'List',
    'The Inventory List'
);

谢谢,但是没有运气。我有种感觉控制器没问题,但Typo3在错误的位置查找。此外,错误提示了Tx_Inventory_Controller_InventoryController类,这是旧的命名类的方式,对吧? - Woeler
哪个TYPO3版本? - jokumer
TYPO3 版本 7.6.15 - Woeler
1
我看到您提供的文档中有一个小错误。请在 ext_tables.php 中更改 $_EXTKEY,即您注册插件的位置。对于 "\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin($_EXTKEY,...",请改为 "\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin('MyVendor.inventory',..." - jokumer
你的语法中有两个错误需要纠正 - 如我在答案中所写/编辑的。 - jokumer
请不要替换$_EXTKEY。如果您将其设置为固定字符串,特别是在composer模式下,可能会引发各种问题。 - pgampe

0

我曾经遇到过完全相同的问题 - 如果使用composer安装Typo3,就会出现这种情况。要解决此问题,请参见文档的此页面


0
尝试在你的 ext_emconf.php 中添加 autoload(将 'Vendor\\Extensionkey\\' 替换为你自己的命名空间),然后卸载并重新安装你的扩展(以重建 PHP 的自动加载信息)。
  'autoload' =>
    array (
        'psr-4' =>
            array (
                'Vendor\\Extensionkey\\' => 'Classes',
            ),
    ),
    '_md5_values_when_last_written' => 'a:0:{}',
    'suggests' => array(
),

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接