Бандл symfony для установки данных из ФИАС.
Для установки ФИАС используются xml-файлы, ссылки на которые предоставляются SOAP-сервисом информирования ФИАС.
Бандл устанавливается с помощью composer и следует стандартной структуре, поэтому на symfony >=4.2 устанавливается автоматически.
-
Установить пакет с помощью composer:
composer require liquetsoft/fias-symfony
-
В силу огромных размеров данных ФИАС, сущности
Doctrineне регистрируются сразу в проекте. Для каждой предоставленMappedSuperclass, с помощью которого можно получать обновления полей исключительно для тех сущностей, которые требуются проекту. Кроме того, это позволит дополнить или изменить структуру таблиц. Например, для добавления списка адресов:<?php // src/Entity/AddressObject.php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\AddrObj as LiquetsoftAddrObj; use App\Repository\AddressObjectRepository; /** * Адреса. */ #[ORM\Entity(repositoryClass: AddressObjectRepository::class)] class AddrObj extends LiquetsoftAddrObj { }
Список доступных суперклассов:
Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\AddrObjLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\AddrObjDivisionLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\AddrObjTypesLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\AdmHierarchyLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\ApartmentsLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\ApartmentTypesLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\CarplacesLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\ChangeHistoryLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\HousesLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\HouseTypesLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\MunHierarchyLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\NormativeDocsLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\NormativeDocsKindsLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\NormativeDocsTypesLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\ObjectLevelsLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\OperationTypesLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\ParamLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\ParamTypesLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\ReestrObjectsLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\RoomsLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\RoomTypesLiquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\Steads
-
Отдельно следует создать сущность для управления версиями ФИАС, установленными на проекте, которая используется для обновления:
<?php // src/Entity/FiasVersion.php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\FiasVersion as LiquetsoftFiasVersion; /** * Сущность, которая хранит текущую версию ФИАС. */ #[ORM\Entity()] class FiasVersion extends LiquetsoftFiasVersion { }
-
После создания всех сущностей, следует создать соответствующие им миграции, и применить их:
bin/console make:migration
bin/console doctrine:migration:migrate
-
Необходимо указать бандлу какие именно сущности используются (те сущности, для которых не указан класс конвертации использоваться не будут) и в какие объекты конвертируются (важно понимать, что сущность на стороне проекта может быть любой, даже не унаследованной от одного из суперклассов, стандартный сериализатор symfony попробует преобразовать xml в указанный объект):
# config/packages/liquetsoft_fias.yaml liquetsoft_fias: # сущность, которая хранит версии ФИАС version_manager_entity: App\Entity\FiasVersion # массив, в котором указывается какие сущности в какой объект преобразовывать entity_bindings: ADDR_OBJ: App\Entity\AddrObj ADDR_OBJ_DIVISION: App\Entity\AddrObjDivision ADDR_OBJ_TYPES: App\Entity\AddrObjTypes ADM_HIERARCHY: App\Entity\AdmHierarchy APARTMENTS: App\Entity\Apartments APARTMENT_TYPES: App\Entity\ApartmentTypes CARPLACES: App\Entity\Carplaces CHANGE_HISTORY: App\Entity\ChangeHistory HOUSES: App\Entity\Houses HOUSE_TYPES: App\Entity\HouseTypes MUN_HIERARCHY: App\Entity\MunHierarchy NORMATIVE_DOCS: App\Entity\NormativeDocs NORMATIVE_DOCS_KINDS: App\Entity\NormativeDocsKinds NORMATIVE_DOCS_TYPES: App\Entity\NormativeDocsTypes OBJECT_LEVELS: App\Entity\ObjectLevels OPERATION_TYPES: App\Entity\OperationTypes PARAM: App\Entity\Param PARAM_TYPES: App\Entity\ParamTypes REESTR_OBJECTS: App\Entity\ReestrObjects ROOMS: App\Entity\Rooms ROOM_TYPES: App\Entity\RoomTypes STEADS: App\Entity\Steads
-
Поскольку для записи в БД используется
Doctrine, нужно отключить логгирование запросов, иначе скрипт падает с переполнением памяти:# config/packages/doctrine.yaml doctrine: dbal: logging: false # отключаем логгирование profiling: false # отключаем профилирование
Бандл определяет несколько значимых команды консоли:
-
Установка ФИАС с ноля
bin/console liquetsoft:fias:install
-
Обновление ФИАС через дельту (установка запускается только в первый раз, а обновление следует поставить в качестве задачи для
cron)bin/console liquetsoft:fias:update
-
Текущий статус серверов ФИАС (сервис информирования или сервер с файлами могут быть недоступны по тем или иным причинам)
bin/console liquetsoft:fias:status
-
Список доступных для установки и обновления версий ФИАС
bin/console liquetsoft:fias:versions
-
Загрузка и распаковка архива с полной версией ФИАС
bin/console liquetsoft:fias:download /path/to/download latest --extract
-
Установка ФИАС из указанного каталога
bin/console liquetsoft:fias:install_from_folder /path/to/extracted/fias
-
Обновление ФИАС из указанного каталога
bin/console liquetsoft:fias:update_from_folder /path/to/extracted/fias
-
Принудительная установка номера текущей версии ФИАС
bin/console liquetsoft:fias:version_set 20160101
Есть несколько возможностей ускорить импорт, используя настройки бандла:
-
убрать неиспользуемые сущности; к примеру, если информация о парковочных местах не требуется, то можно отключить соответствие для CARPLACES
# config/packages/liquetsoft_fias.yaml liquetsoft_fias: entity_bindings: # CARPLACES: App\Entity\Carplaces
-
поскольку в формате ГАР все данные разделены по папкам регионов, то можно исключить обработку файлов для неиспользуемых регионов
# config/packages/liquetsoft_fias.yaml liquetsoft_fias: files_filter: - "#^.+/extracted/30/AS_.+$#" # разрешает все данные для региона - "#^.+/extracted/AS_.+$#" # разрешает общие словари # все остальные файлы будут проигнорированы