Completed
Push — master ( aa416e...658cec )
by Tobias
10:27
created

Command/GeocodeCommand.php (1 issue)

Labels
Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the BazingaGeocoderBundle package.
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 *
10
 * @license    MIT License
11
 */
12
13
namespace Bazinga\GeocoderBundle\Command;
14
15
use Geocoder\ProviderAggregator;
16
use Geocoder\Query\GeocodeQuery;
17
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
18
use Symfony\Component\Console\Input\InputArgument;
19
use Symfony\Component\Console\Input\InputInterface;
20
use Symfony\Component\Console\Input\InputOption;
21
use Symfony\Component\Console\Output\OutputInterface;
22
23
/**
24
 * @author Markus Bachmann <[email protected]>
25
 */
26
class GeocodeCommand extends ContainerAwareCommand
27
{
28
    protected static $defaultName = 'geocoder:geocode';
29
30
    /**
31
     * @var ProviderAggregator
32
     */
33
    private $geocoder;
34
35
    /**
36
     * @param ProviderAggregator $geocoder
37
     */
38 1
    public function __construct(ProviderAggregator $geocoder)
39
    {
40 1
        $this->geocoder = $geocoder;
41
42 1
        parent::__construct();
43 1
    }
44
45
    /**
46
     * {@inheritdoc}
47
     */
48 1
    protected function configure()
49
    {
50
        $this
51 1
            ->setName('geocoder:geocode')
52 1
            ->setDescription('Geocode an address or a ip address')
53 1
            ->addArgument('address', InputArgument::REQUIRED, 'The address')
54 1
            ->addOption('provider', null, InputOption::VALUE_OPTIONAL)
55 1
            ->setHelp(<<<'HELP'
56 1
The <info>geocoder:geocoder</info> command will fetch the latitude
57
and longitude from the given address.
58
59
You can force a provider with the "provider" option.
60
61
<info>php bin/console geocoder:geocoder "Eiffel Tower" --provider=yahoo</info>
62
HELP
63
            );
64 1
    }
65
66
    /**
67
     * {@inheritdoc}
68
     */
69 1
    protected function execute(InputInterface $input, OutputInterface $output)
70
    {
71 1
        if ($input->getOption('provider')) {
72
            $this->geocoder->using($input->getOption('provider'));
73
        }
74
75 1
        $results = $this->geocoder->geocodeQuery(GeocodeQuery::create($input->getArgument('address')));
0 ignored issues
show
It seems like $input->getArgument('address') targeting Symfony\Component\Consol...nterface::getArgument() can also be of type array<integer,string> or null; however, Geocoder\Query\GeocodeQuery::create() does only seem to accept string, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
76 1
        $data = $results->first()->toArray();
77
78 1
        $max = 0;
79
80 1
        foreach ($data as $key => $value) {
81 1
            $length = strlen($key);
82 1
            if ($max < $length) {
83 1
                $max = $length;
84
            }
85
        }
86
87 1
        $max += 2;
88
89 1
        foreach ($data as $key => $value) {
90 1
            $key = $this->humanize($key);
91
92 1
            $output->writeln(sprintf(
93 1
                '<comment>%s</comment>: %s',
94 1
                str_pad($key, $max, ' ', STR_PAD_RIGHT),
95 1
                is_array($value) ? json_encode($value) : $value
96
            ));
97
        }
98 1
    }
99
100 1
    private function humanize(string $text): string
101
    {
102 1
        $text = preg_replace('/([A-Z][a-z]+)|([A-Z][A-Z]+)|([^A-Za-z ]+)/', ' \1', $text);
103
104 1
        return ucfirst(strtolower($text));
105
    }
106
}
107