Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Class "Nyholm\Psr7\Factory\HttplugFactory" is deprecated since version 1.8, use "Nyholm\Psr7\Factory\Psr17Factory" instead #196

Open
forthowin opened this issue Jun 23, 2023 · 0 comments

Comments

@forthowin
Copy link

forthowin commented Jun 23, 2023

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:

$geocodeData = app('geocoder')->geocode($this->visitorIp)->get()->first();

Here is my geocoder config:

<?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';
    }
}

Here are the relevant composer installs:


"php": "^8.1",
"laravel/framework": "^10.13",
"geocoder-php/geoip2-provider": "^4.3",
"geocoder-php/ipstack-provider": "^0.4.0",
"toin0u/geocoder-laravel": "^4.6",
"guzzlehttp/guzzle": "^7.7",
"php-http/guzzle7-adapter": "^1.0",

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant