You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<?php
use App\Providers\Geocoder\Providers\GeoIP2\GeoIP2;
use App\Providers\Geocoder\Providers\Ipstack\Ipstack;
use Geocoder\Provider\Chain\Chain;
use GeoIp2\WebService\Client as WebService;
use Http\Adapter\Guzzle7\Client;
return [
'cache' => [
/*
|-----------------------------------------------------------------------
| Cache Store
|-----------------------------------------------------------------------
|
| Specify the cache store to use for caching. The value "null" will use
| the default cache store specified in /config/cache.php file.
|
| Default: null
|
*/
'store' => null,
/*
|-----------------------------------------------------------------------
| Cache Duration
|-----------------------------------------------------------------------
|
| Specify the cache duration in minutes. The default approximates a
| "forever" cache, but there are certain issues with Laravel's forever
| caching methods that prevent us from using them in this project.
|
| Default: 9999999 (integer)
|
*/
'duration' => 9999999,
],
/*
|---------------------------------------------------------------------------
| Providers
|---------------------------------------------------------------------------
|
| Here you may specify any number of providers that should be used to
| perform geocaching operations. The `chain` provider is special,
| in that it can contain multiple providers that will be run in
| the sequence listed, should the previous provider fail. By
| default the first provider listed will be used, but you
| can explicitly call subsequently listed providers by
| alias: `app('geocoder')->using('google_maps')`.
|
| Please consult the official Geocoder documentation for more info.
| https://github.com/geocoder-php/Geocoder#providers
|
*/
'providers' => [
Chain::class => [
Ipstack::class => [env('IPSTACK_ACCESS_KEY')],
GeoIP2::class => [],
],
],
/*
|---------------------------------------------------------------------------
| Adapter
|---------------------------------------------------------------------------
|
| You can specify which PSR-7-compliant HTTP adapter you would like to use.
| There are multiple options at your disposal: CURL, Guzzle, and others.
|
| Please consult the official Geocoder documentation for more info.
| https://github.com/geocoder-php/Geocoder#usage
|
| Default: Client::class (FQCN for CURL adapter)
|
*/
'adapter' => Client::class,
/*
|---------------------------------------------------------------------------
| Reader
|---------------------------------------------------------------------------
|
| You can specify a reader for specific providers, like GeoIp2, which
| connect to a local file-database. The reader should be set to an
| instance of the required reader class.
|
| Please consult the official Geocoder documentation for more info.
| https://github.com/geocoder-php/geoip2-provider
|
| Default: null
|
*/
'reader' => [
WebService::class => [
env('MAXMIND_USER_ID'),
env('MAXMIND_LICENSE_KEY'),
],
],
];
Here is Ipstack.php:
<?php
declare(strict_types=1);
/*
* This file is part of the Geocoder package.
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
* @license MIT License
*/
namespace App\Providers\Geocoder\Providers\Ipstack;
use App\Providers\Geocoder\Model\Address;
use Geocoder\Collection;
use Geocoder\Exception\InvalidArgument;
use Geocoder\Exception\InvalidCredentials;
use Geocoder\Exception\QuotaExceeded;
use Geocoder\Exception\UnsupportedOperation;
use Geocoder\Http\Provider\AbstractHttpProvider;
use Geocoder\Model\AddressCollection;
use Geocoder\Provider\Provider;
use Geocoder\Query\GeocodeQuery;
use Geocoder\Query\ReverseQuery;
use Psr\Http\Client\ClientInterface;
/**
* @author Jonas Gielen <[email protected]>
*/
final class Ipstack extends AbstractHttpProvider implements Provider
{
/**
* @var string
*/
const GEOCODE_ENDPOINT_URL = 'http://api.ipstack.com/%s?access_key=%s';
/**
* @var string
*/
private $apiKey;
/**
* @param ClientInterface $client an HTTP adapter
* @param string $apiKey an API key
*/
public function __construct(ClientInterface $client, string $apiKey)
{
if (empty($apiKey)) {
throw new InvalidCredentials('No API key provided.');
}
$this->apiKey = $apiKey;
parent::__construct($client);
}
/**
* {@inheritdoc}
*/
public function geocodeQuery(GeocodeQuery $query): Collection
{
$address = $query->getText();
// This API doesn't handle IPs
if (! filter_var($address, FILTER_VALIDATE_IP)) {
throw new UnsupportedOperation('The Ipstack provider does not support street addresses.');
}
if (in_array($address, ['127.0.0.1', '::1'])) {
return new AddressCollection([$this->getLocationForLocalhost()]);
}
$url = sprintf(sprintf(self::GEOCODE_ENDPOINT_URL, $address, $this->apiKey));
if (null !== $query->getLocale()) {
$url = sprintf('%s&language=%s', $url, $query->getLocale());
}
$body = $this->getUrlContents($url);
$data = json_decode($body, true);
// https://ipstack.com/documentation#errors
if (isset($data['error'])) {
switch ($data['error']['code']) {
case 301:
throw new InvalidArgument('Invalid request (a required parameter is missing).');
case 303:
throw new InvalidArgument('Bulk requests are not supported on your plan. Please upgrade your subscription.');
case 104:
throw new QuotaExceeded('The maximum allowed amount of monthly API requests has been reached.');
case 101:
throw new InvalidCredentials('No API Key was specified or an invalid API Key was specified.');
}
}
if (null === $data['latitude']
&& null === $data['longitude']
&& null === $data['connection']
&& null === $data['city']
&& null === $data['region_name']
&& null === $data['region_code']
&& null === $data['zip']
&& null === $data['country_name']
&& null === $data['country_code']) {
return new AddressCollection([]);
}
$adminLevels = [];
$adminLevels[] = ['name' => $data['region_name'], 'code' => $data['region_code'], 'level' => 1];
$locations[] = Address::createFromArray([
'providedBy' => $this->getName(),
'latitude' => $data['latitude'] ?: null,
'longitude' => $data['longitude'] ?: null,
'connection' => $data['connection'] ?: null,
'locality' => $data['city'] ?: null,
'postalCode' => $data['zip'] ?: null,
'country' => $data['country_name'] ?: null,
'countryCode' => $data['country_code'] ?: null,
'adminLevels' => $adminLevels,
]);
return new AddressCollection($locations);
}
/**
* {@inheritdoc}
*/
public function reverseQuery(ReverseQuery $query): Collection
{
throw new UnsupportedOperation('The Ipstack provider is not able to do reverse geocoding.');
}
/**
* {@inheritdoc}
*/
public function getName(): string
{
return 'ipstack';
}
}
Class "Nyholm\Psr7\Factory\HttplugFactory" is deprecated since version 1.8, use "Nyholm\Psr7\Factory\Psr17Factory" instead. in /vendor/nyholm/psr7/src/Factory/HttplugFactory.php on line 18
The text was updated successfully, but these errors were encountered:
General Information
GeocoderLaravel Version: 4.6
Laravel Version: 10.13
PHP Version: 8.1
Operating System and Version: macOS Monterey
Issue Description
I'm getting the warning message in the title. How do I make geocoder use Psr17Factory?
Steps to Replicate
The code I am using:
Here is my geocoder config:
Here is Ipstack.php:
Here are the relevant composer installs:
Stack Trace
Class "Nyholm\Psr7\Factory\HttplugFactory" is deprecated since version 1.8, use "Nyholm\Psr7\Factory\Psr17Factory" instead. in /vendor/nyholm/psr7/src/Factory/HttplugFactory.php on line 18
The text was updated successfully, but these errors were encountered: