GeolocListener.php 1.76 KB
Newer Older
1 2 3 4 5 6 7 8
<?php
namespace App\EventListener;

use App\Entity\Adherent;
use App\Entity\EntityTrait\GeolocEntityTrait;
use App\Entity\Geoloc;
use App\Entity\Prestataire;
use App\Entity\User;
Julien Jorry committed
9
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
10 11 12 13 14 15
use Doctrine\ORM\Event\PreUpdateEventArgs;
use Geocoder\Provider\Nominatim\Nominatim;
use Geocoder\Query\GeocodeQuery;

class GeolocListener
{
Julien Jorry committed
16 17 18 19 20 21
    public function postPersist(LifecycleEventArgs $eventArgs)
    {
        $entity = $eventArgs->getObject();
        $this->updateGeoLoc($entity);
    }

22 23 24
    public function preUpdate(PreUpdateEventArgs $eventArgs)
    {
        $entity = $eventArgs->getEntity();
25
        if (!($entity instanceof Geoloc) || ($entity instanceof Geoloc) && !($eventArgs->hasChangedField('adresse') || $eventArgs->hasChangedField('cpostal') || $eventArgs->hasChangedField('ville') || $eventArgs->hasChangedField('lat') || $eventArgs->hasChangedField('lon'))) {
26 27
            return;
        }
Julien Jorry committed
28 29 30 31 32 33 34 35
        $this->updateGeoLoc($entity);
    }

    private function updateGeoLoc($entity)
    {
        if (!$entity instanceof Geoloc) {
            return;
        }
36 37
        // GEOCODING ADDRESS :
        $httpClient = new \Http\Adapter\Guzzle6\Client();
38
        $provider = Nominatim::withOpenStreetMapServer($httpClient, 'Mozilla/5.0');
39 40 41 42 43 44 45 46 47 48 49
        $geocoder = new \Geocoder\StatefulGeocoder($provider, 'fr');
        $fullAddress = $entity->getAdresse().' '.$entity->getCpostal().' '.$entity->getVille();
        // Query geocoding from complete addresse
        $result = $geocoder->geocodeQuery(GeocodeQuery::create($fullAddress));
        if (count($result) > 0) {
            $coords = $result->first()->getCoordinates();
            $entity->setLat($coords->getLatitude());
            $entity->setLon($coords->getLongitude());
        }
    }
}