Symfony 4 и Doctrine Mongo DB

Это эпопея началась с потребностью работать с документоориентированной базой данных. В качестве СУБД(Система Управления Базами Данных) было принято решение использовать MongoDB. Проект, в котором это делалось писался на Symfony 4 и поэтомулёг встал вопрос: «Как это всё так сделать, чтобы ух!»

Начнём с самого простого и самого важного — установки MongoDB.

Нас интересует только первый шаг, поэтому я приведу его в явном виде:

sudo apt update
sudo apt install -y mongodb

Эти две команды устанавливают Mongo на ваш компьютер и теперь выкороль  можете с ним работать.Там же, где приведена установка, есть всяческие штучки, чтобы понять, что MongoDB действительно установилось.

Дальше приступим к точнейшей настройки Symfony.Основной гайдинтересен и занимателен, но если у вас аллергия на английский — оставайтесь с нами).

Как говорит автор: «…бла бла бла, давайте установим эти два пакета: «

"alcaeus/mongo-php-adapter"
"doctrine/mongodb-odm-bundle"

Устанавливаются они крайне просто черезcomposerи вдобавокalcaeusуже установлен вместе сPHP 7. После установки этих пакетов пришло время внести поправки в конфигурацию, а точнее в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_mysql'
        server_version: '5.7'
        charset: utf8mb4
        default_table_options:
            charset: utf8mb4
            collate: utf8mb4_unicode_ci
        # With Symfony 3.3, remove the `resolve:` prefix
        url: '%env(resolve:DATABASE_URL)%'
    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
doctrine_mongodb:
    connections:
        default:
            server: "%mongodb_server%"
            options: {}
    default_database: yourdbnamehere
    document_managers:
        default:
            auto_mapping: true
            mappings:
                App:
                    is_bundle: false
                    type: annotation
                    dir: '%kernel.project_dir%/src/Document'
                    prefix: 'App\Document'
                    alias: App

После внесения изменений файл должен выглядит примерно так.Очень важнони чего не удалять из этого файла, как и из других, если ты не понимаешь, что делаешь).

Поскольку будем использовать именно Mongo Document, нужно создать папку вsrcпод названием«Document». Как вы можете видеть выше, «mongodb_server» должен быть определён где-то. Автор рекомендует поместить вservices.yamlи после этого помещения это будет выглядеть как-то так:

# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
  mongodb_server: "mongodb://localhost:27017"
services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        public: false       # Allows optimizing the container by removing unused services; this also means
                            # fetching services directly from the container via $container->get() won't work.
                            # The best practice is to be explicit about your dependencies anyway.
    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/*'
        exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'
    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']
    # add more service definitions when explicit configuration is needed
    # please note that last definitions always *replace* previous ones

Если composer не внёс изменений вbundles.php, нужно ему в этом помочь. После (или до) вашей помощи, должна быть вот такая строка:

Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true],

Мы изменили 3 файла. Не больше не меньше (пересчитай и верни на место то, что изменил не по статье). Так же вэтой статьеприводится способ проверки корректности действий и пример структуры Mongo Document’а. Думаю, что читатель, если захочет, справится с этим и без моего чуткого руководства. Долгих дней и приятных ночей!