1
假設我有一個命令,做了簡單的人:如何共享沒有繼承的命令配置?
class PlainTextHelloWorldCommand extends Command
{
protected function configure()
{
$this
->setName('text:hello')
->addArgument('receiver', InputArgument::REQUIRED, 'Who do you want to greet?');
}
/**
* @param InputInterface $input
* @param OutputInterface $output
* @return int|null|void
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$receiver = $input->getArgument('receiver');
$output->writeln("Hello {$receiver}!");
}
}
另一個命令現在也需要receiver
說法:
class HtmlHelloCommand extends Command
{
/**
*
* @throws InvalidArgumentException
*/
protected function configure()
{
$this
->setName('html:hello')
->addArgument('receiver', InputArgument::REQUIRED, 'Who do you want to greet?');
}
/**
* @param InputInterface $input
* @param OutputInterface $output
* @return int|null|void
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$receiver = $input->getArgument('receiver');
$output->writeln("<html><h1>Hello {$receiver}!</h1></html>");
}
}
現在我在想如何不重複自己。
我想共享邏輯來添加參數和解析輸入,以便它在一個地方。
我知道我可以創建一個「ReceiverAwareCommand」,但如果我獲得更多參數會發生什麼?
我不想讓SendEmailCommand擴展MessageAwareGreeterCommand擴展receiverAwareCommand ...`。這條路似乎導致了地獄,因此我喜歡避免繼承。
此外,我的示例被簡化,只要兩個示例命令基本相同。事實並非如此。此外,我有大約10個參數,而每個命令最多可能需要4個參數。
我只想在沒有我自己的情況下設置這些參數。
我正在考慮裝飾模式的方向,但我有點困惑如何設置它們在這種情況下,所以它感覺錯誤。
因此,我想知道:這是如何實現的?
你試圖調用*父::配置(); *添加新的論據之前用'$ this-> setName('html:hello')...'給子類?它應該將參數添加到父類參數中。 –
@ A.L重點是避免繼承。是的,那麼我需要做'parent :: configure()'和'parent :: execute()'。這只是我不想要的路線,因爲一個命令需要不同形式的多個參數。 – k0pernikus
您是否嘗試過僅使用一個帶有多個可選參數的命令?您將能夠在html或文本輸入等之間切換。 –