我正在用symfony 4制作测试CLI-app,我想知道,是否可以将单个ClassCommand用于多种用途?!
例如,我的测试cli-app有几个动作/命令,但是它们非常相似。我不喜欢重复代码(也没有人丢弃DRY建议),所以我认为最好使用单个命令,但要根据其名称选择使用哪种算法。例如。命令名称user:manager将执行一组指令,而user:designer-将执行另一组指令,并且所有这些都将在一个ClassCommand中执行。
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class UserCommand extends Command
{
// some properties
protected function configure()
{
$this
->setName('user:somebody')
// and other stuff
}
protected function execute(InputInterface $input, OutputInterface $output)
{
// output code here
}
}
对于其他命令,我现在必须创建另一个ClassCommand。好的,我可以从UserCommand扩展它,但是我仍然必须指定方法“ configure”和“ execute”(如果必须重写)。多余的代码太多了,对吗?
此刻我还不知道该如何做。
回到问题:可以使命令名动态化吗?
答案 0 :(得分:0)
不可能,这是不可能的。但是我认为那不是正确的解决方案。
我建议采用以下方法之一;要么:
为每组指令创建一个命令(例如, a b c
0 1 5 9.0
1 3 7 0.0
2 2 6 NaN
3 4 8 NaN
的一个命令类和user:manager
的一个命令类)。然后,您可以使用特征或从通用抽象类进行扩展。
或将参数传递给单个命令类-例如user:designer
我可以从UserCommand扩展它,但是我仍然必须指定方法“ configure”和“ execute”(如果必须重写)。多余的代码太多了,对吗?
您可以在抽象的UserCommand中指定这两种方法,并声明一些抽象方法,例如bin/console user:do-thing --type=designer
,这些方法将在设计器类中实现。