Cette bibliothèque vous permet d'utiliser la doctrine (ORM ou DBAL) avec PostGIS, l'extension de la base de données spatiale pour PostgreSQL.
Le tableau suivant montre les versions qui sont officiellement soutenues par cette bibliothèque.
Dépendance | Versions prises en charge |
---|---|
Postgis | 3.0 et 3.1 |
Postgresql | 11, 12 et 13 |
Doctrine orm | ^ 2.9 |
Doctrine dbal | ^ 2.13 et ^ 3.1 |
Installez la dernière version avec Composer.
composer require jsor/doctrine-postgis
Consultez la page Packagist pour toutes les versions disponibles.
Pour utiliser la bibliothèque avec la doctrine ORM, enregistrez l'abonné de l'événement ORMSchemaEventSubscriber
.
use Jsor Doctrine PostGIS Event ORMSchemaEventSubscriber ;
$ entityManager -> getEventManager ()-> addEventSubscriber ( new ORMSchemaEventSubscriber ());
Pour l'utiliser avec le DBAL UNIQUEMENT, enregistrez l'abonné de l'événement DBALSchemaEventSubscriber
.
use Jsor Doctrine PostGIS Event DBALSchemaEventSubscriber ;
$ connection -> getEventManager ()-> addEventSubscriber ( new DBALSchemaEventSubscriber ());
Pour intégrer cette bibliothèque dans un projet Symfony, lisez la documentation dédiée à Symfony.
Une fois l'abonné de l'événement enregistré, la geometry
et geography
des types de colonnes peuvent être utilisées dans les mappages de propriétés (veuillez lire les documents PostGIS pour comprendre la différence entre ces deux types).
use Doctrine ORM Mapping as ORM ;
use Jsor Doctrine PostGIS Types PostGISType ;
#[ ORM Entity ]
class MyEntity
{
#[ ORM Column (type: PostGISType :: GEOMETRY )]
private string $ geometry ;
#[ ORM Column (type: PostGISType :: GEOGRAPHY )]
private string $ geography ;
}
Il existe 2 options pour configurer la géométrie.
geometry_type
Ceci définit le type de géométrie, comme POINT
, LINESTRING
, etc. Si vous omettez cette option, la GEOMETRY
de type générique est utilisée.srid
Ceci définit l'identifiant du système de référence spatial (SRID) de la géométrie. use Doctrine ORM Mapping as ORM ;
use Jsor Doctrine PostGIS Types PostGISType ;
#[ ORM Entity ]
class MyEntity
{
#[ ORM Column (
type: PostGISType :: GEOMETRY ,
options: [ ' geometry_type ' => ' POINT ' ],
)]
public string $ point ;
#[ ORM Column (
type: PostGISType :: GEOMETRY ,
options: [ ' geometry_type ' => ' POINTZM ' ],
)]
public string $ point4D ;
#[ ORM Column (
type: PostGISType :: GEOMETRY ,
options: [ ' geometry_type ' => ' POINT ' , ' srid ' => 3785 ],
)]
public string $ pointWithSRID ;
public function __construct (
string $ point ,
string $ point4D ,
string $ pointWithSRID ,
) {
$ this -> point = $ point ;
$ this -> point4D = $ point4D ;
$ this -> pointWithSRID = $ pointWithSRID ;
}
}
Les valeurs prévues pour les propriétés doivent être au format WKT. Veuillez noter que les valeurs renvoyées de la base de données peuvent différer des valeurs que vous avez définies. La bibliothèque utilise ST_ASEWKT pour conserver autant d'informations que possible (comme celle de SRID). En savoir plus dans les documents Postgis.
$ entity = new MyEntity (
point: ' POINT(-122.0845187 37.4220761) ' ,
point4D: ' POINT(1 2 3 4) ' ,
pointWithSRID: ' SRID=3785;POINT(-122.0845187 37.4220761) ' ,
);
Les index spatiaux peuvent être définis pour les champs de géométrie en définissant l'indicateur spatial
.
use Doctrine ORM Mapping as ORM ;
#[ ORM Entity ]
#[ ORM Index (
fields: [ ' pointWithSRID ' ],
flags: [ ' spatial ' ],
)]
class MyEntity
{
}
Un support complet pour l'outil de schéma ORM et le gestionnaire de schéma DBAL est fourni.
La plupart des fonctions PostGIS sont également disponibles pour le langage de requête Doctrine (DQL) sous l'espace de noms JsorDoctrinePostGISFunctions
.
Pour une liste complète de toutes les fonctions prises en charge, consultez l'indice de fonction.
Lisez la documentation Symfony dédiée sur la façon de configurer les fonctions avec Symfony.
Les fonctions doivent être enregistrées avec l'instance DoctrineORMConfiguration
.
$ configuration = new Doctrine ORM Configuration ();
$ configuration -> addCustomStringFunction (
' ST_Within ' ,
Jsor Doctrine PostGIS Functions ST_Within ::class
);
$ configuration -> addCustomNumericFunction (
' ST_Distance ' ,
Jsor Doctrine PostGIS Functions ST_Distance ::class
);
$ dbParams = [ /***/ ];
$ entityManager = Doctrine ORM EntityManager :: create ( $ dbParams , $ configuration );
Il existe une classe de configuratrice de commodité qui peut être utilisée pour enregistrer toutes les fonctions à la fois.
$ configuration = new Doctrine ORM Configuration ();
Jsor Doctrine PostGIS Functions Configurator :: configure ( $ configuration );
$ dbParams = [ /***/ ];
$ entityManager = Doctrine ORM EntityManager :: create ( $ dbParams , $ configuration );
Lisez la documentation dédiée à Symfony sur la façon de gérer ces problèmes avec Symfony.
Étant donné que Postgis peut ajouter quelques nouveaux schémas, comme topology
, tiger
et tiger_data
, vous voudrez peut-être les exclure de la gestion par la doctrine.
Cela peut être fait en configurant un filtre d'actifs de schéma.
$ configuration = new Doctrine ORM Configuration ();
$ configuration -> setSchemaAssetsFilter ( static function ( $ assetName ): bool {
if ( $ assetName instanceof AbstractAsset ) {
$ assetName = $ assetName -> getName ();
}
return ( bool ) preg_match ( ' /^(?!tiger)(?!topology)/ ' , $ assetName );
});
$ dbParams = [ /***/ ];
$ entityManager = Doctrine ORM EntityManager :: create ( $ dbParams , $ configuration );
Parfois, l'outil de schéma trébuche sur les types de bases de données qu'il ne peut pas gérer. Une exception commune est quelque chose comme
DoctrineDBALException: Unknown database type _text requested, DoctrineDBALPlatformsPostgreSQL100Platform may not support it.
Pour résoudre ce problème, les types de base de données inconnus peuvent être mappés sur des types connus.
$ configuration = new Doctrine ORM Configuration ();
$ dbParams = [ /***/ ];
$ entityManager = Doctrine ORM EntityManager :: create ( $ dbParams , $ configuration );
$ entityManager -> getConnection ()-> getDatabasePlatform ()-> registerDoctrineTypeMapping ( ' _text ' , ' string ' );
Remarque: Ce type n'est alors pas adapté pour être utilisé dans les mappages d'entités. Il empêche simplement les exceptions de "type de base de données inconnues ..." lancées lors des inspections de base de données par l'outil de schéma.
Si vous souhaitez utiliser ce type dans vos entités, vous devez configurer les types de bases de données réelles, par exemple avec le package PostgreSQL pour la doctrine.
Une configuration Docker simple est incluse pour exécuter la suite de test par rapport aux différentes combinaisons PostgreSQL / Postgis.
Toutes les commandes ici doivent être exécutées à partir de la racine du projet.
Tout d'abord, construisez le conteneur PHP. Cela ne doit être fait qu'une seule fois.
./docker/build-php.sh
Installez les dépendances via le compositeur.
./docker/run-php.sh composer install
Ensuite, démarrez les conteneurs de la base de données.
docker compose -f ./docker/docker-compose.yml up -d
Il existe un certain nombre de scripts de raccourci disponibles pour exécuter des commandes à l'intérieur du conteneur PHP connecté à des conteneurs de base de données spécifiques.
Les noms de script suivent le modèle run-<POSTGRESQL_VERSION>-<POSTGIS_VERSION>.sh
.
Pour exécuter la suite de test contre PostgreSQL 13 avec Postgis 3.1, utilisez le script ./docker/run-13-31.sh
.
./docker/run-13-31.sh vendor/bin/phpunit --exclude-group=postgis-3.0
Notez que nous excluons les tests ciblés sur Postgis 3.0 ici. Lorsque vous exécutez des tests contre PostGIS 3.0, excluez les tests de 3.1.
./docker/run-13-30.sh vendor/bin/phpunit --exclude-group=postgis-3.1
Copyright (c) 2014-2024 Jan Sorgalla. Libéré sous la licence du MIT.