找不到 TYPO3 控制器 Class。我在哪里link呢?

TYPO3 Controller Class could not be found. Where do I link it?

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

Class Secsign\Secsign\Controller\SecsignController does not exist. Reflection failed.

<?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"
    }
}

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

1。通过项目 composer.json

加载你的扩展

为你的自定义扩展创建一个文件夹,我在这里命名它 Extensions 并将你所有的自定义扩展移动到这个文件夹中。您的 public/typo3conf/ext/ 文件夹现在应该只包含由作曲家加载的扩展,并且可以随时清除,因为一个简单的 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 -> ../../../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.json 自动加载 类,您的扩展 composer.json 甚至没有执行。

决赛

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