TYPO3:带有参数和依赖注入的 Symfony 命令
TYPO3: Symfony command with arguments AND dependency injection
我在 TYPO3 中创建了一个带有参数和依赖注入 (DI) 的命令。
正如我在 symfony 中所理解的那样,DI 是使用 __construct 方法制作的。但是我还必须说明我想传递给命令的参数。那么如何正确完成呢?
来源:
- symfony DI 是如何制作的:https://symfony.com/doc/current/console.html#getting-services-from-the-service-container
- TYPO3 中带有 symfony 的命令控制器:https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/BackendModules/CliScripts/Index.html?highlight=command%20controller#creating-a-new-symfony-command-in-your-extension
版本: 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 代替。
我在 TYPO3 中创建了一个带有参数和依赖注入 (DI) 的命令。 正如我在 symfony 中所理解的那样,DI 是使用 __construct 方法制作的。但是我还必须说明我想传递给命令的参数。那么如何正确完成呢?
来源:
- symfony DI 是如何制作的:https://symfony.com/doc/current/console.html#getting-services-from-the-service-container
- TYPO3 中带有 symfony 的命令控制器:https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/BackendModules/CliScripts/Index.html?highlight=command%20controller#creating-a-new-symfony-command-in-your-extension
版本: 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 代替。