【问题标题】:TYPO3 Controller Class could not be found. Where do I link it?找不到 TYPO3 控制器类。我在哪里链接它?
【发布时间】:2019-10-21 10:37:20
【问题描述】:

我正在为 TYPO3 v9.5.9 开发一个扩展,并且已经编写了我所有的代码,但是当我尝试使用该扩展时,我收到一条错误消息说

类 Secsign\Secsign\Controller\SecsignController 不存在。 反射失败。

<?php
namespace Secsign\Secsign\Controller;

$apiPath = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('secsign') . 'Resources/Public/SecSignIDApi/phpApi/SecSignIDApi.php';
require_once($apiPath);

use AuthSession;
use SecSignIDApi;
use \TYPO3\CMS\Core\Utility\GeneralUtility;


/**
 * SecsignController
 */
class SecsignController extends ActionController
{...}

控制器确实存在,但由于某种原因无法找到。这个错误发生在哪里?我如何解决它?欢迎任何提示。

composer.json 文件如下所示:

{
    "name": "secsign/secsign",
    "type": "typo3-cms-extension",
    "description": "This extension allows users to authenticate using their smart phone running the SecSign App.",
    "authors": [
        {
            "name": "SecSign Technologies Inc.",
            "role": "Developer"
        }
    ],
    "require": {
        "typo3/cms-core": "^9.5"
    },
    "autoload": {
        "psr-4": {
            "Secsign\\Secsign\\": "Classes",
            "TYPO3\\CMS\\Secsign\\": "public/typo3conf/ext/secsign/Classes/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Secsign\\Secsign\\Tests\\": "Tests"
        }
    },
    "replace": {
        "secsign/secsign": "self.version",
        "typo3-ter/secsign": "self.version"
    }
}

【问题讨论】:

  • 您是否尝试过刷新系统缓存并重建 PHP 自动加载信息?
  • 是的,我已经尝试过多次了。没有运气。
  • 尝试从命名空间中删除反斜杠。查看@jokumer 的回答here
  • 1) 不建议使用带有前导反斜杠的 use 语句(但无论如何应该可以使用)2) 您的 composer.json 看起来如何?
  • @GhanshyamBhava 我必须在我的每一节课上都这样做吗?

标签: php typo3 typo3-9.x typo3-extensions


【解决方案1】:

有两种方法可以解决这个问题:

1。通过项目 composer.json 加载您的扩展

为您的自定义扩展创建一个文件夹,我在这里将其命名为Extensions,并将您的所有自定义扩展移动到此文件夹中。您的 public/typo3conf/ext/ 文件夹现在应该只包含由 composer 加载的扩展,并且可以随时清除,因为简单的 composer i 将带回所有扩展。

└── projectRoot
    ├── Extensions
    │   └── secsign
    │       └── Classes
    ├── composer.json
    └── public
        └── typo3conf
            └── ext
                └── secsign(symlink_by_composer)

将此添加到您的项目 composer.json:

  "repositories": {
    "0": {
      "type": "composer",
      "url": "https://composer.typo3.org/"
    },
    "1": {
      "type": "path",
      "url": "./Extensions/*",
      "options": {
        "symlink": true
      }
    }
  },

  ...

  "require": {
    "secsign/secsign": "*",
    ...
  },

从扩展 composer.json 中的自动加载中删除第二行

public/Extensions/secsign/composer.json:

  "autoload": {
    "psr-4": {
      "Secsign\\Secsign\\": "Classes/"
    }
  },

现在 composer 加载您的项目 composer.json,找到您的扩展,将其符号链接到typo3conf/ext/ 并读取您的扩展 composer.json 并执行它。

将所有 Ext 加载到您的项目中:当您完成所有这些更改后,只需执行 composer update。这会将您所有的第三方扩展加载到projectRoot/public/typo3conf/ext/ 并从secsign -&gt; ../../../Extensions/secsign 符号链接您的自定义扩展

添加更多自定义扩展:只需将您的自定义扩展添加到Extension/,确保它具有有效的composer.json 并将其包含在

composer req secsign/one-more-ext

2。将你的类添加到你的项目 composer.json

把你的扩展留在原处,不要关心你的扩展 composer.json 和 只需将您的类添加到您的项目composer.json:

  "autoload": {
    "psr-4": {
      "Secsign\\Secsign\\": "htdocs/typo3conf/ext/secsign/Classes/"
    }
  },

现在 composer 会从你的项目 composer.json 中自动加载类,你的扩展 composer.json 甚至不会被执行。

决赛

  1. 似乎更容易,但选择 1 有几个原因。

【讨论】:

  • 目前我的项目 composer.json 的存储库部分如下所示:` "repositories": [ { "type": "composer", "url": "composer.typo3.org" } ] ,`我将如何添加您提到的存储库声明?我似乎无法弄清楚。另外,一旦完成,我如何将扩展加载到 TYPO3 中?
  • @droemmelbert 我在上面的示例中添加了typo3.org 存储库。我还添加了如何一步到 1。
  • 我确实做到了。通过 composer.json 加载它就可以了。谢谢!
猜你喜欢
  • 2015-02-14
  • 1970-01-01
  • 2017-04-29
  • 2021-07-12
  • 1970-01-01
  • 2016-11-11
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多