1 | <?php |
||||||
2 | |||||||
3 | namespace DH\NavigationBundle\Command; |
||||||
4 | |||||||
5 | use DateTime; |
||||||
6 | use DH\NavigationBundle\Model\Routing\Summary; |
||||||
7 | use DH\NavigationBundle\NavigationManager; |
||||||
8 | use Symfony\Component\Console\Command\Command; |
||||||
9 | use Symfony\Component\Console\Exception\InvalidArgumentException; |
||||||
10 | use Symfony\Component\Console\Helper\Table; |
||||||
11 | use Symfony\Component\Console\Input\InputInterface; |
||||||
12 | use Symfony\Component\Console\Input\InputOption; |
||||||
13 | use Symfony\Component\Console\Output\OutputInterface; |
||||||
14 | use Symfony\Component\Console\Style\SymfonyStyle; |
||||||
15 | |||||||
16 | class RoutingCommand extends Command |
||||||
17 | { |
||||||
18 | protected static $defaultName = 'navigation:routing'; |
||||||
19 | |||||||
20 | /** |
||||||
21 | * @var NavigationManager |
||||||
22 | */ |
||||||
23 | private $manager; |
||||||
24 | |||||||
25 | public function __construct(NavigationManager $manager) |
||||||
26 | { |
||||||
27 | $this->manager = $manager; |
||||||
28 | |||||||
29 | parent::__construct(); |
||||||
30 | } |
||||||
31 | |||||||
32 | /** |
||||||
33 | * {@inheritdoc} |
||||||
34 | */ |
||||||
35 | protected function configure(): void |
||||||
36 | { |
||||||
37 | $this |
||||||
38 | ->setName('navigation:routing') |
||||||
39 | ->setDescription('Computes a route') |
||||||
40 | ->addOption('provider', null, InputOption::VALUE_REQUIRED) |
||||||
41 | ->addOption('waypoint', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Point de passage') |
||||||
42 | ->addOption('departure', null, InputOption::VALUE_REQUIRED, 'Departure date and time (YYYY-MM-DDD HH:II:SS)') |
||||||
43 | ->addOption('arrival', null, InputOption::VALUE_REQUIRED, 'Arrival date and time (YYYY-MM-DDD HH:II:SS)') |
||||||
44 | ->addOption('traffic', null, InputOption::VALUE_REQUIRED, 'Traffic mode (enabled/disabled/default depending on provider)') |
||||||
45 | ->addOption('language', null, InputOption::VALUE_REQUIRED, 'Language (fr-FR, en-US, etc.)') |
||||||
46 | ->setHelp( |
||||||
47 | <<<'EOF' |
||||||
48 | The <info>navigation:routing</info> command will compute a route from the given addresses. |
||||||
49 | |||||||
50 | You can choose a provider with the "provider" option. |
||||||
51 | |||||||
52 | <info>php bin/console navigation:routing --waypoint="45.834278,1.260816" --waypoint="44.830109,-0.603649" --provider=here</info> |
||||||
53 | EOF |
||||||
54 | ) |
||||||
55 | ; |
||||||
56 | } |
||||||
57 | |||||||
58 | /** |
||||||
59 | * {@inheritdoc} |
||||||
60 | */ |
||||||
61 | protected function execute(InputInterface $input, OutputInterface $output) |
||||||
62 | { |
||||||
63 | if (\count($input->getOption('waypoint')) < 2) { |
||||||
0 ignored issues
–
show
Bug
introduced
by
![]() |
|||||||
64 | throw new InvalidArgumentException('A route needs at least two waypoints (start and end locations).'); |
||||||
65 | } |
||||||
66 | |||||||
67 | if ($input->getOption('provider')) { |
||||||
68 | $this->manager->using($input->getOption('provider')); |
||||||
69 | } |
||||||
70 | |||||||
71 | $query = $this->manager->createRoutingQuery(); |
||||||
72 | |||||||
73 | foreach ($input->getOption('waypoint') as $waypoint) { |
||||||
74 | $query->addWaypoint($waypoint); |
||||||
75 | } |
||||||
76 | |||||||
77 | if ($input->getOption('departure')) { |
||||||
78 | $query->setDepartureTime(new DateTime($input->getOption('departure'))); |
||||||
0 ignored issues
–
show
It seems like
$input->getOption('departure') can also be of type string[] ; however, parameter $time of DateTime::__construct() does only seem to accept string , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
79 | } |
||||||
80 | |||||||
81 | if ($input->getOption('arrival')) { |
||||||
82 | $query->setArrivalTime(new DateTime($input->getOption('arrival'))); |
||||||
83 | } |
||||||
84 | |||||||
85 | if ($input->getOption('traffic')) { |
||||||
86 | $query->setTrafficMode($input->getOption('traffic')); |
||||||
0 ignored issues
–
show
The method
setTrafficMode() does not exist on DH\NavigationBundle\Cont...g\RoutingQueryInterface . It seems like you code against a sub-type of DH\NavigationBundle\Cont...g\RoutingQueryInterface such as DH\NavigationBundle\Prov...re\Routing\RoutingQuery .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
87 | } |
||||||
88 | |||||||
89 | if ($input->getOption('language')) { |
||||||
90 | $query->setLanguage($input->getOption('language')); |
||||||
91 | } |
||||||
92 | |||||||
93 | $response = $query->execute(); |
||||||
94 | |||||||
95 | $io = new SymfonyStyle($input, $output); |
||||||
96 | |||||||
97 | $routes = $response->getRoutes(); |
||||||
98 | |||||||
99 | $io->section('Summary'); |
||||||
100 | |||||||
101 | $data = []; |
||||||
102 | foreach ($routes as $index => $route) { |
||||||
103 | /** |
||||||
104 | * @var Summary |
||||||
105 | */ |
||||||
106 | $summary = $route->getSummary(); |
||||||
107 | $data[] = [ |
||||||
108 | $index + 1, |
||||||
109 | $summary->getDistance()->getFormattedValue(2), |
||||||
110 | $summary->getTravelTime()->getFormattedValue(2), |
||||||
111 | ]; |
||||||
112 | } |
||||||
113 | |||||||
114 | $table = new Table($output); |
||||||
115 | $table |
||||||
116 | ->setHeaders(['route', 'distance', 'duration']) |
||||||
117 | ->setRows($data) |
||||||
118 | ; |
||||||
119 | $table->render(); |
||||||
120 | |||||||
121 | $io->newLine(); |
||||||
122 | |||||||
123 | foreach ($routes as $routeIndex => $route) { |
||||||
124 | $io->section('Route #'.($routeIndex + 1)); |
||||||
125 | |||||||
126 | $legs = $route->getLegs(); |
||||||
127 | foreach ($legs as $legIndex => $leg) { |
||||||
128 | $steps = $leg->getSteps(); |
||||||
129 | $io->writeln(sprintf('<comment>Leg #%d</comment> - %d steps.', $legIndex + 1, \count($steps))); |
||||||
130 | |||||||
131 | $data = []; |
||||||
132 | foreach ($steps as $stepIndex => $step) { |
||||||
133 | $data[] = [ |
||||||
134 | $stepIndex + 1, |
||||||
135 | implode(', ', $step->getPosition()), |
||||||
136 | $step->getDistance()->getFormattedValue(2), |
||||||
137 | $step->getDuration()->getFormattedValue(2), |
||||||
138 | $step->getInstruction(), |
||||||
139 | ]; |
||||||
140 | } |
||||||
141 | |||||||
142 | $table = new Table($output); |
||||||
143 | $table |
||||||
144 | ->setHeaders(['step', 'position', 'distance', 'duration', 'instruction']) |
||||||
145 | ->setRows($data) |
||||||
146 | ->setColumnMaxWidth(4, 100) |
||||||
147 | ; |
||||||
148 | $table->render(); |
||||||
149 | $io->newLine(); |
||||||
150 | } |
||||||
151 | } |
||||||
152 | |||||||
153 | return 0; |
||||||
154 | } |
||||||
155 | } |
||||||
156 |