Skip to content
Бандл для импорта ФИАС в проект на Symfony
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
Command
DependencyInjection
Docker
Entity
Generator
Resources add tests for entities May 15, 2019
Serializer
Storage
Tests
VersionManager add implementation for setCurrentVersion method of DoctrineVersionMan… May 14, 2019
.gitignore
.php_cs.dist
.travis.yml
LICENSE
LiquetsoftFiasBundle.php
README.md
composer.json
phpunit.xml.dist
psalm.xml

README.md

ФИАС bundle

Latest Stable Version Total Downloads License Build Status Scrutinizer Code Quality

Бандл symfony для установки данных из ФИАС.

Для установки ФИАС используются xml-файлы, ссылки на которые предоставляются SOAP-сервисом информирования ФИАС.

Установка

Бандл устанавливается с помощью composer и следует стандартной структуре, поэтому на symfony >=4.2 устанавливается автоматически.

  1. Установить пакет с помощью composer:

    composer require ramsey/uuid-doctrine liquetsoft/fias-symfony
  2. В силу огромных размеров данных ФИАС, сущности Doctrine не регистрируются сразу в проекте, тем не менее, для каждой предоставлен MappedSuperclass, с помощью которого можно получать обновления полей исключительно для тех сущностей, которые требуются проекту. Кроме того, это позволит дополнить или изменить структуру таблиц. Например, для добавления списка адресов:

    <?php
    //src/Entity/AddressObject.php
    
    namespace App\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * Адреса.
     *
     * @ORM\Entity(repositoryClass="App\Repository\AddressObjectRepository")
     */
    class AddressObject extends \Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\AddressObject
    {
    }

    Список доступных суперклассов:

    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\ActualStatus,
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\ActualStatus
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\AddressObject
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\AddressObjectType
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\CenterStatus
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\CurrentStatus
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\EstateStatus
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\FlatType
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\House
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\HouseStateStatus
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\IntervalStatus
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\NormativeDocument
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\NormativeDocumentType
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\OperationStatus
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\Room
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\RoomType
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\Stead
    • Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\StructureStatus
  3. Отдельно следует создать сущность для управления версиями ФИАС, установленными на проекте, которая, в частности, используется для обновления:

    <?php
    //src/Entity/FiasVersion.php
    
    namespace App\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * Сущность, которая хранит текущую версию ФИАС.
     *
     * @ORM\Entity
     */
    class FiasVersion extends \Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Entity\FiasVersion
    {
    }
  4. После создания всех сущностей, следует создать соответствующие им миграции и применить их:

    bin/console make:migration
    bin/console doctrine:migration:migrate
  5. Следует указать бандлу какие именно сущности используются и в какие объекты конвертируются (важно понимать, что сущность на стороне проекта может быть любой, даже не унаследованной от одного из суперклассов, стандартный сериализатор symfony попробует преобразовать xml в указанный объект):

    liquetsoft_fias:
        # сущность, которая хранит версии ФИАС
        version_manager_entity: App\Entity\FiasVersion
        # массив, в котором указывается какие сущности в какой объект преобразовывать
        entity_bindings:
            ActualStatus: App\Entity\ActualStatus
            AddressObject: App\Entity\AddressObject
            AddressObjectType: App\Entity\AddressObjectType
            CenterStatus: App\Entity\CenterStatus
            CurrentStatus: App\Entity\CurrentStatus
            EstateStatus: App\Entity\EstateStatus
            FlatType: App\Entity\FlatType
            House: App\Entity\House
            HouseStateStatus: App\Entity\HouseStateStatus
            IntervalStatus: App\Entity\IntervalStatus
            NormativeDocument: App\Entity\NormativeDocument
            NormativeDocumentType: App\Entity\NormativeDocumentType
            OperationStatus: App\Entity\OperationStatus
            Room: App\Entity\Room
            RoomType: App\Entity\RoomType
            Stead: App\Entity\Stead
            StructureStatus: App\Entity\StructureStatus
  6. По умолчанию для записи используется Doctrine, что может быть довольно медленно, хоть и дает возможность использовать все преимущества Doctrine (события, логгирование запросов и т.д.). В качестве альтернативы предлагается использовать bulk insert, он значительно быстрее:

    # config/packages/liquetsoft_fias.yaml
    services:
        # заменяем сервис для записи на сервис, который использует bulk insert
        liquetsoft_fias.storage.service:
            class: Liquetsoft\Fias\Symfony\LiquetsoftFiasBundle\Storage\BulkInsertDoctrineStorage
            arguments:
                - '@doctrine'
                - '%liquetsoft_fias.insert_batch_count%'
    
    liquetsoft_fias:
        # сущность, которая хранит версии ФИАС
        version_manager_entity: App\Entity\FiasVersion
        # массив, в котором указывается какие сущности в какой объект преобразовывать
        entity_bindings:
            ActualStatus: App\Entity\ActualStatus
            AddressObject: App\Entity\AddressObject
            AddressObjectType: App\Entity\AddressObjectType
            CenterStatus: App\Entity\CenterStatus
            CurrentStatus: App\Entity\CurrentStatus
            EstateStatus: App\Entity\EstateStatus
            FlatType: App\Entity\FlatType
            House: App\Entity\House
            HouseStateStatus: App\Entity\HouseStateStatus
            IntervalStatus: App\Entity\IntervalStatus
            NormativeDocument: App\Entity\NormativeDocument
            NormativeDocumentType: App\Entity\NormativeDocumentType
            OperationStatus: App\Entity\OperationStatus
            Room: App\Entity\Room
            RoomType: App\Entity\RoomType
            Stead: App\Entity\Stead
            StructureStatus: App\Entity\StructureStatus
  7. Поскольку для записи в БД используется Doctrine, нужно отключить логгирование запросов, иначе скрипт падает с переполнением памяти:

    # config/packages/doctrine.yaml
    parameters:
        # Adds a fallback DATABASE_URL if the env var is not set.
        # This allows you to run cache:warmup even if your
        # environment variables are not available yet.
        # You should not need to change this value.
        env(DATABASE_URL): ''
    
    doctrine:
        dbal:
            # configure these for your database server
            driver: 'pdo_pgsql'
            server_version: '11'
            charset: utf8
            default_table_options:
                charset: utf8
                collate: utf8_unicode_ci
    
            url: '%env(resolve:DATABASE_URL)%'
            logging: false # отключаем логгирование
            profiling: false # отключаем профилирование
        orm:
            auto_generate_proxy_classes: '%kernel.debug%'
            naming_strategy: doctrine.orm.naming_strategy.underscore
            auto_mapping: true
            mappings:
                App:
                    is_bundle: false
                    type: annotation
                    dir: '%kernel.project_dir%/src/Entity'
                    prefix: 'App\Entity'
                    alias: App

Для примера, все шаги установки сделаны в тестовом проекте, который реализует простейшее REST API с использованием API platform.

Использование

Бандл определяет две значимых команды консоли:

  1. Установка ФИАС с ноля

    bin/console liquetsoft:fias:install
  2. Обновление ФИАС через дельту

    bin/console liquetsoft:fias:update

Соответственно, установка запускается только в первый раз, а обновление следует поставить в качестве задачи для cron.

You can’t perform that action at this time.