由于我不知道如何描述它,我没有在google或stack中找到任何结果。
我想用Controller-Action列出所有可用的控制台命令(可以通过使用bin/console调用),这样我就可以将所有命令的列表转发给twig。
我怎么能做到这一点呢?
有趣的问题。当然,您可以只运行console命令本身并捕获命令列表。这可能是最好的方法。
然而,有一个名为console.command_loader
的服务,它有一个名为getNames的方法,该方法确实返回命令名称列表。它实现CommandLoaderInterface。
最初我尝试创建一个别名,这样它就可以被注入到一个动作方法中:
services:
SymfonyComponentConsoleCommandLoaderCommandLoaderInterface:
alias: console.command_loader
但是我一直没有找到console.command_loader,这是令人费解的,因为调试:容器显示它。该服务被标记为container.no_preload
,这可能与此有关。不确定。
所以我去定义控制器服务:
services:
AppControllerCommandController:
tags:
- 'controller.service_arguments'
arguments:
- '@console.command_loader'
让我有点惊讶的是,它成功了。
class CommandController extends AbstractController
{
public function __construct(private CommandLoaderInterface $cl)
{
}
#[Route('/commands', name: 'app_commands')]
public function commands(): Response
{
$names = $this->cl->getNames();
dump($names);
// I happen to have a command called app:init
$initCommand = $this->cl->get('app:init');
dump($initCommand->getDescription());
//return $this->render('default/index.html.twig', [
// 'controller_name' => 'DefaultController ' . 'Commands',
//]);
}
}
这些都是在Symfony 6中完成的。碰巧手头没有Symfony 3应用程序。您的第一步将是确认Symfony 3也具有bin/console debug:container console.command_loader
服务。如果它没有这样的服务,那就去看看它是否有类似的服务。