Symfony 2.8.24集成PostGIS扩展配置求助(离线环境)
嘿,我太懂你这种被网络代理卡着没法用Composer、官方文档又没讲清楚离线安装步骤的糟心感了!针对Symfony 2.8.24 + PostGIS的适配,我给你整理了一套从0到1的分步指南,保证每一步都能落地:
第一步:离线获取兼容的Jsor/Doctrine-PostGIS库
因为你没法在线用Composer安装,得手动搞到适配Symfony 2.8的库版本:
- 找到Jsor的Doctrine-PostGIS仓库,下载1.6.x系列的release包(2.x及以上版本只支持Symfony3+,和你的2.8不兼容)
- 解压下载的zip包,把里面的
src文件夹里的内容,放到你Symfony项目的vendor/jsor/doctrine-postgis/src路径下(要自己手动创建vendor/jsor/doctrine-postgis这个目录结构) - 确认一下路径:
vendor/jsor/doctrine-postgis/src/Jsor/Doctrine/PostGIS/Types/GeographyType.php这个文件必须存在,这样后续才能找到这个类
第二步:手动更新Composer自动加载
离线放的库,Composer不会自动识别,得手动配置:
- 打开项目根目录的
composer.json文件,找到autoload下的psr-4节点,添加一行:"Jsor\\Doctrine\\PostGIS\\": "vendor/jsor/doctrine-postgis/src/Jsor/Doctrine/PostGIS/" - 在项目根目录运行命令:
php composer.phar dump-autoload(如果你本地有composer.phar文件),这一步会更新自动加载规则,让Symfony能找到PostGIS的类
第三步:配置Doctrine识别PostGIS类型
接下来要让Doctrine知道怎么处理PostGIS的地理类型,修改app/config/config.yml:
- 在
doctrine.dbal下面添加类型注册:doctrine: dbal: types: geography: Jsor\Doctrine\PostGIS\Types\GeographyType geometry: Jsor\Doctrine\PostGIS\Types\GeometryType point: Jsor\Doctrine\PostGIS\Types\PointType # 如果你需要其他类型(比如polygon、linestring),也可以在这里添加 connections: default: # 这里保留你原本的数据库连接配置(driver、host、dbname这些) driver: pdo_pgsql # ... 其他配置 # 关键:添加类型映射,让Doctrine把数据库的PostGIS类型和我们注册的类关联起来 mapping_types: geography: geography geometry: geometry point: point - 还得在项目启动时注册这些类型,打开
app/autoload.php,在文件末尾添加:use Jsor\Doctrine\PostGIS\Types\GeographyType; use Jsor\Doctrine\PostGIS\Types\GeometryType; // 注册PostGIS类型,避免Doctrine报错 if (!GeographyType::hasType('geography')) { GeographyType::addType('geography', GeographyType::class); } if (!GeometryType::hasType('geometry')) { GeometryType::addType('geometry', GeometryType::class); }
第四步:在实体中使用PostGIS类型
现在可以在你的实体里定义地理字段了,比如创建一个Location实体:
<?php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="locations") */ class Location { /** * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") * @ORM\Column(type="integer") */ private $id; /** * 定义一个经纬度点(WGS84坐标系,SRID=4326) * @ORM\Column(type="geography", options={"geometry_type"="POINT", "srid"=4326}) */ private $coordinates; // Getter和Setter方法 public function getId() { return $this->id; } public function getCoordinates() { return $this->coordinates; } public function setCoordinates($coordinates) { $this->coordinates = $coordinates; return $this; } }
这里的options里,geometry_type指定是点类型,srid=4326是全球通用的经纬度坐标系,你可以根据自己的需求调整。
第五步:生成数据库表并验证
最后一步就是把实体同步到数据库:
- 先确保你的PostgreSQL数据库已经启用了PostGIS扩展,登录数据库运行:
CREATE EXTENSION postgis;(如果还没启用的话) - 在Symfony项目根目录运行命令:
php app/console doctrine:schema:update --force - 登录数据库查看
locations表,应该能看到coordinates字段是geography(Point,4326)类型,就说明配置成功了!
额外注意事项
- 一定要选对库的版本:1.6.x系列才适配Symfony2.8,别下错了版本导致兼容性问题
- 如果你用的是Linux系统,要注意文件路径的大小写,PHP对大小写敏感,别把
GeographyType写成geographytype - 如果还是找不到类,检查
vendor里的目录结构是否和我第一步说的一致,确保GeographyType.php的路径完全正确
内容的提问来源于stack exchange,提问作者Scaramouche
相关产品推荐
相关产品推荐

