Прикручиваем Doctrine 2 ORM к Silex

в 0:12, , рубрики: Doctrine ORM, Doctrine2, micro-framework, orm, php, silex, symfony, метки: , , , ,

Недавно узнал о великолепном микро-фреймворке Silex, и примерно столь же недавно о модели ORM. Туториал будет полезен тем, кто хочет связать одно с другим.
Silex — легкий, расширяемый микро-фреймворк, построен на компонентах Symfony 2 и Pimple.
Doctrine — ORM движок, позволяющий работать с БД не напрямую, а через обычные объекты.
Статья написана по мотивам этой, однако не является ее переводом.
Что же, попробуем связать одно с другим. Для установки библиотек будем использовать Composer.

Определим зависимости в composer.json

{
    "minimum-stability": "dev",
    "require": {
        "php": ">=5.3.3",
        "silex/silex": "1.*",
        "taluu/doctrine-orm-provider": "1.0.*"
    },
    "config": {
        "bin-dir": "bin"
    }
}

Стоит пояснить поле config. В нем мы указываем место, куда Composer создаст ярлыки (aliases) на файлы, исполняемые в консоли.
Выполним composer install

Добавим код приложения

В корне проекта создадим папку приложения — app/src, или любую другую на выбор. Следуя шаблону(который кстати можно установить, чего я не стал делать) я назвал src.
В index.php добавим следующий код:

// index.php
<?php

$app = require __DIR__.'/src/app.php';
$app->run();

Здесь мы подключаем автозагрузчик классов, созданный Composer, а также в $app выгружаем приложение и запускаем его.
Что же внутри app.php:

// src/app.php
<?php

require __DIR__.'/../vendor/autoload.php';

$app = new SilexApplication();
$app['debug'] = true;

require __DIR__.'/registers.php';
require __DIR__.'/controllers.php';
return $app;

В controllers.php опишем логику контроллеров: $app->get(), $app->error() и тд.
Нас же интересует registers.php:

// src/registers.php
<?php

use DoctrineCommonCacheApcCache;
use DoctrineCommonCacheArrayCache;

$app->register(new SilexProviderDoctrineServiceProvider(), array(
    'db.options' => array(// Подробнее настройка DBAL тут: http://silex.sensiolabs.org/doc/providers/doctrine.html
        'driver' => 'pdo_mysql', 
        'dbname' => 'silex_test',
        'host' => '127.0.0.1',
        'user' => 'root',
        'password' => 'root',
        'charset' => 'utf8'
    )
));

$app->register(new NutwerkProviderDoctrineORMServiceProvider(), array(
    'db.orm.proxies_dir'           => __DIR__.'/../cache/doctrine/proxy',
    'db.orm.proxies_namespace'     => 'DoctrineProxy',
    'db.orm.cache'                 =>
        !$app['debug'] && extension_loaded('apc') ? new ApcCache() : new ArrayCache(),
    'db.orm.auto_generate_proxies' => true,
    'db.orm.entities'              => array(array(
        'type'      => 'annotation',       // как определяем поля в Entity
        'path'      => __DIR__,   // Путь, где храним классы
        'namespace' => 'TestAppEntity', // Пространство имен
    )),
));

Согласно указанному namespace создадим директории, в данном случае:
src/TestApp и src/TestApp/Entity

Настроим консольное управление Doctrine

Прийдется немного изменить код в консольных инструментов(дальше просто консоль) Doctrine, доступных, благодаря Composer в bin.
Чтобы связать консоль и наше приложение настроим cli-config.php. Изначально этот файл находится в vendor/doctrine/orm/tools/sandbox, скопируем от туда в bin. А теперь удалим все, кроме создания $helpers.
Весь удаленный код создавал и настраивал то, что мы настроили для нашего приложения. Так почему бы нам это не использовать?

// bin/cli-config.php
<?php

$app = require __DIR__.'/../src/app.php';
$em = $app['db.orm.em'];
$helpers = new SymfonyComponentConsoleHelperHelperSet(array(
    'db' => new DoctrineDBALToolsConsoleHelperConnectionHelper($em->getConnection()),
    'em' => new DoctrineORMToolsConsoleHelperEntityManagerHelper($em)
));

Тут стоит добавить, что работая в нашем приложении с Doctine, копию EntityManager мы сможем получить из $app['db.orm.em']

Варианты подключения этих настроек:

  1. Не правильный вариант, так делать не стоит:
    Исправим bin/doctrine.php:

    	$configFile = getcwd() . DIRECTORY_SEPARATOR . 'bin/cli-config.php'; // 21 строка
    

    Подобное можно было и не делать, поместив cli-config.php в корень проекта. С одной стороны не правильно править код библиотек, с другой — удобно.

  2. Можно пойти и иным, более правильным путем — создать свою консоль и подключить свои конфиги самостоятельно:
    // bin/console
    #!/usr/bin/env php
    <?php
    require 'cli-config.php';
    include('doctrine.php');
    

    Теперь надо дать права на исполнение bin/console и для запуска из корня проекта использовать:

    ./bin/console [command_name]
    

Что еще почитать по теме:
Русская документация по Doctrine
Английская документация по Doctrine ORM

Автор: GusakovNick

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js