Passed
Push — master ( 068bff...27cbbc )
by Kirill
03:24
created

Command::configureCommand()   A

Complexity

Conditions 5
Paths 4

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
dl 0
loc 16
ccs 0
cts 13
cp 0
rs 9.4222
c 0
b 0
f 0
cc 5
nc 4
nop 0
crap 30

1 Method

Rating   Name   Duplication   Size   Complexity  
A Command::getApplication() 0 4 1
1
<?php
2
/**
3
 * This file is part of Railt package.
4
 *
5
 * For the full copyright and license information, please view the LICENSE
6
 * file that was distributed with this source code.
7
 */
8
declare(strict_types=1);
9
10
namespace Railt\Console;
11
12
use Symfony\Component\Console\Command\Command as Symfony;
13
use Symfony\Component\Console\Input\InputInterface;
14
use Symfony\Component\Console\Output\OutputInterface;
15
16
/**
17
 * Class Command
18
 */
19
abstract class Command extends Symfony
20
{
21
    /**
22
     * @var string
23
     */
24
    protected $signature = '';
25
26
    /**
27
     * @var string
28
     */
29
    protected $description = '';
30
31
    /**
32
     * @var InputInterface
33
     */
34
    private $input;
35
36
    /**
37
     * @var OutputInterface
38
     */
39
    private $output;
40
41
    /**
42
     * @throws \Symfony\Component\Console\Exception\InvalidArgumentException
43
     */
44
    public function configure(): void
45
    {
46
        try {
47
            $parser = new SignatureParser($this->signature);
48
49
            $this->setName($parser->getName());
50
            $this->setDescription($this->description ?: \get_class($this) . ' command');
51
52
            foreach ($parser->getArguments() as $argument) {
53
                $this->getDefinition()->addArgument($argument);
54
            }
55
56
            foreach ($parser->getOptions() as $option) {
57
                $this->getDefinition()->addOption($option);
58
            }
59
        } catch (\Throwable $e) {
60
            $this->throw($e);
61
        }
62
    }
63
64
    /**
65
     * @param \Throwable $e
66
     * @param OutputInterface|null $output
67
     * @throws \Symfony\Component\Console\Exception\InvalidArgumentException
68
     */
69
    private function throw(\Throwable $e, OutputInterface $output = null): void
70
    {
71
        $this->getApplication()->throw($e, $output ?? $this->output);
0 ignored issues
show
Documentation introduced by
$output ?? $this->output is of type object<Symfony\Component...Output\OutputInterface>, but the function expects a null|object<Symfony\Comp...e\Output\ConsoleOutput>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
72
    }
73
74
    /**
75
     * @return Application|\Symfony\Component\Console\Application
76
     */
77
    public function getApplication(): Application
78
    {
79
        return parent::getApplication();
80
    }
81
82
    /**
83
     * @param InputInterface $input
84
     * @param OutputInterface $output
85
     * @return int|null|void
86
     * @throws \Symfony\Component\Console\Exception\InvalidArgumentException
87
     * @throws \Throwable
88
     */
89
    public function execute(InputInterface $input, OutputInterface $output)
90
    {
91
        $this->input  = $input;
92
        $this->output = $output;
93
94
        try {
95
            $this->callHandle();
96
        } catch (\Throwable $e) {
97
            $this->throw($e, $output);
98
        }
99
    }
100
101
    /**
102
     * @throws \BadMethodCallException
103
     */
104
    private function callHandle(): void
105
    {
106
        $container = $this->getApplication()->getContainer();
107
108
        if (! \method_exists($this, 'handle')) {
109
            $error = 'Command %s::handle method should be provided';
110
            throw new \BadMethodCallException(\sprintf($error, static::class));
111
        }
112
113
        $container->call([$this, 'handle']);
114
    }
115
}
116