TYPO3:带有参数和依赖注入的 Symfony 命令

TYPO3: Symfony command with arguments AND dependency injection

我在 TYPO3 中创建了一个带有参数和依赖注入 (DI) 的命令。 正如我在 symfony 中所理解的那样,DI 是使用 __construct 方法制作的。但是我还必须说明我想传递给命令的参数。那么如何正确完成呢?

来源:

版本: TYPO3 9.5.5,symfony 4.2.5

假设我想将一个参数传递给命令并从 TYPO3 注入 ObjectManager:

<?php

namespace Vendor\ExtensionName\Command;

use TYPO3\CMS\Extbase\Object\ObjectManagerInterface;
use Symfony\Component\Console\Command\Command;

class SomeCommand extends Command 
{

    /**
     * Object Manager
     *
     * @var \TYPO3\CMS\Extbase\Object\ObjectManagerInterface
     */
    protected $objectManager;

    /**
     * @param \TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager
     */
    public function __construct(
        string $cliParameter,
        \TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager) 
    {
        $this->cliParameter = $cliParameter;
        $this->objectManager = $objectManager;
    }
}

然后我用

调用它
bin/typo3 extension_name:someCommand foo

(其中 foo$cliParameter

我明白了

Uncaught TYPO3 Exception Cannot instantiate interface TYPO3\CMS\Extbase\Object\ObjectManagerInterface

所以我的问题是:我做错了什么?正确的做法是什么?

Symfony 命令与 Extbase 无关。所以你不能使用 DI before TYPO3v10。但是,您仍然可以为自己获取 ObjectManager 的实例,然后检索您需要的任何对象:

$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
$exampleRepository = $objectManager->get(ExampleRepository::class);

如果class不依赖Extbase或其DI,你可以直接用GeneralUtility::makeInstance()获取实例。

请注意,使用 TYPO3v10 或更新版本,您可以 use the native TYPO3 DI for commands 代替。