Skip to content

Latest commit

 

History

History
135 lines (104 loc) · 3.02 KB

doctrine.md

File metadata and controls

135 lines (104 loc) · 3.02 KB

Doctrine annotation support

<< Back to documentation index

Wouldn't it be great if you could automatically save the coordinates of a users address every time it is updated? Wait not more here is the feature you been always wanted.

First of all, update your entity:

use Bazinga\GeocoderBundle\Mapping\Annotations as Geocoder;

/**
 * @Geocoder\Geocodeable
 */
class User
{
    /**
     * @Geocoder\Address
     */
    private $address;

    /**
     * @Geocoder\Latitude
     */
    private $latitude;

    /**
     * @Geocoder\Longitude
     */
    private $longitude;
}

Instead of annotating a property, you can also annotate a getter:

use Bazinga\GeocoderBundle\Mapping\Annotations as Geocoder;

/**
 * @Geocoder\Geocodeable
 */
class User
{
    /**
     * @Geocoder\Latitude
     */
    private $latitude;

    /**
     * @Geocoder\Longitude
     */
    private $longitude;

    /**
     * @Geocoder\Address
     */
    public function getAddress(): string
    {
        // Your code...
    }
}

Secondly, register the Doctrine event listener and its dependencies in your config/services.yaml file. You have to indicate which provider to use to reverse geocode the address. Here we use acme provider we declared in bazinga_geocoder configuration earlier.

    Bazinga\GeocoderBundle\Mapping\Driver\AnnotationDriver:
        class: Bazinga\GeocoderBundle\Mapping\Driver\AnnotationDriver
        arguments:
            - '@annotations.reader'

    Bazinga\GeocoderBundle\Doctrine\ORM\GeocoderListener:
        class: Bazinga\GeocoderBundle\Doctrine\ORM\GeocoderListener
        arguments:
            - '@bazinga_geocoder.provider.acme'
            - '@Bazinga\GeocoderBundle\Mapping\Driver\AnnotationDriver'
        tags:
            - { name: doctrine.event_listener, event: onFlush }

It is done! Now you can use it:

$user = new User();
$user->setAddress('Brandenburger Tor, Pariser Platz, Berlin');

$em->persist($event);
$em->flush();

echo $user->getLatitude(); // will output 52.516325
echo $user->getLongitude(); // will output 13.377264

PHP 8

If you are using PHP 8, you can use Attributes in your entity:

use Bazinga\GeocoderBundle\Mapping\Annotations as Geocoder;

#[Geocoder\Geocodeable()]
class User
{
    #[Geocoder\Address()]
    private $address;

    #[Geocoder\Latitude()]
    private $latitude;

    #[Geocoder\Longitude()]
    private $longitude;
}

Then update your service configuration to register the AttributeDriver:

    Bazinga\GeocoderBundle\Mapping\Driver\AttributeDriver:
        class: Bazinga\GeocoderBundle\Mapping\Driver\AttributeDriver

    Bazinga\GeocoderBundle\Doctrine\ORM\GeocoderListener:
        class: Bazinga\GeocoderBundle\Doctrine\ORM\GeocoderListener
        arguments:
            - '@bazinga_geocoder.provider.acme'
            - '@Bazinga\GeocoderBundle\Mapping\Driver\AttributeDriver'
        tags:
            - { name: doctrine.event_listener, event: onFlush }