Блог Мазепина Василия

Пишу о том, что кажется интересным

Здравствуй MongoDB !!!

2016-04-19 21:00 | Комментарии

Доброго времени суток, коллеги и гости. На днях я начал писать свой проект с применением СУБД MongoDB.
Хотелось поделиться с вами опытом первоначальной установки и настройки стека Symfony Framework 3.0 и MongoDB.

Задача передо мной стояла скорее тривиальная - прикрутить к Symfony MongoBD. Ну, само слово “прикрутить”, наверное, слишком громко, но даже по мануалам были проблемы.

Установка Symfony 3.0

Symfony на данный момент ставится легче легкого:

Установка Symfony
1
2
3
4
5
6
# Скачиваем инсталлер
$ sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony
# Делаем его исполняемой системной софтиной
$ sudo chmod a+x /usr/local/bin/symfony
# Ну, собсна, вот...
$ symfony new имя_проекта

Есть возможность установить любую версию Symfony, подробнее в документации.

Установка MongoDB

А вот с установкой MongoDB есть проблемы. Но, обо всем по порядку. В документации указано, что для ОС Ubuntu данная СУБД установится только для LTS-релизов. А у меня то 15.04. Не ждать же нам новой версии, заюзаем наш давно знакомый LXC. И c помощью LXC можно не просто выбрать Ubuntu LTS, а еще и любую другую ОС.
Но, как говорится, Ubuntu 14.04, я выбираю тебя!! Создал контейнер в LXC с шаблона ubuntu 14.04:

Создание контейнера Ubuntu 14.04 LTS
1
$ sudo lxc-create -t download -n mongo -- -d ubuntu -r trusty -a amd64

После этого, согласно документации, выполняю операции по установке MongoDB

MongoDB
1
2
3
4
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
$ echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
$ sudo apt-get update
$ sudo apt-get install -y mongodb-org

СУБД установлена, но теперь надо связать ее с проектом, расположенным на хост-машине. Для этого я выбрал такой путь: установил пакет для ssh доступа:

1
sudo apt-get install openssh-server

После этого в контейнере я создал пользователя, добавил его в группу sudo. Замысел был таков, что необходимо было открыть MongoDB для хост-машины. Для этого в файле /etc/mongodb.conf меняем директиву bindIp на * . * . * . * - это позволит подключаться к серверу БД удаленно, что мы и сделаем. Т.е., необходимо теперь узнать IP-адрес контейнера, тут поможет команда

1
sudo lxc-info -n mongo

Таким образом, мы узнаем параметры подключения к СУБД.

Возвращаемся к Symfony

Для работы Symfony и MongoDB есть родной бандл, которому для установки необходимо установленное php-расширение(драйвер) mongo. Его можно установить по инструкции

1
sudo pecl install mongo

При установке может возникнуть проблема отстутвия пакета phpize, и установка расширения решится установкой пакета php5-dev.

1
sudo apt-get install php5-dev

После повторной попытки установки, процесс пошел, занял около 30 секунд. Теперь ставим наш бандл в symfony

1
composer require doctrine/mongodb-odm doctrine/mongodb-odm-bundle

Теперь вносим правки в файлы проекта:

app/AppKernel.php
1
2
3
4
5
6
7
8
9
public function registerBundles()
{
    $bundles = array(
        // ...
        new Doctrine\Bundle\MongoDBBundle\DoctrineMongoDBBundle(),
    );

    // ...
}

Правки в файле автозагрузки:

app/autoload.php
1
2
3
use Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver;

AnnotationDriver::registerAnnotationClasses();

Конфигурация проекта:

app/config/config.yml
1
2
3
4
5
6
7
8
9
doctrine_mongodb:
    connections:
        default:
            server: mongodb://ip_адрес_контейнера:27017
            options: {}
    default_database: имя_базы_данных
    document_managers:
        default:
            auto_mapping: true

А для доступа к СУБД из терминала достаточно на host-машине установить пакет mongo

1
sudo apt-get install mongo

Теперь наш проект бех проблем работает с MongoDB, используя старую добрую Doctrine ODM:

src/Acme/StoreBundle/Controller/DefaultController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Acme\StoreBundle\Document\Product;
use Symfony\Component\HttpFoundation\Response;

public function createAction()
{
    $product = new Product();
    $product->setName('A Foo Bar');
    $product->setPrice('19.99');

    $dm = $this->get('doctrine_mongodb')->getManager();
    $dm->persist($product);
    $dm->flush();

    return new Response('Created product id '.$product->getId());
}

Что в итоге?

В итоге мы имеем работающий проект на Symfony в связке с MongoDB, установленным внутри LXC - контейнера. Без сомнения, есть множество других вариантов, я описал лишь наиболее легкий и доступный для меня.
Спасибо за внимание! Спишемся.

Комментарии