Недавно узнал о великолепном микро-фреймворке Silex, и примерно столь же недавно о модели ORM. Туториал будет полезен тем, кто хочет связать одно с другим.
Silex — легкий, расширяемый микро-фреймворк, построен на компонентах Symfony 2 и Pimple.
Doctrine — ORM движок, позволяющий работать с БД не напрямую, а через обычные объекты.
Статья написана по мотивам этой, однако не является ее переводом.
Что же, попробуем связать одно с другим. Для установки библиотек будем использовать Composer.
Определим зависимости в
Стоит пояснить поле config. В нем мы указываем место, куда Composer создаст ярлыки (aliases) на файлы, исполняемые в консоли.
Выполним
В корне проекта создадим папку приложения —
В
Здесь мы в $app выгружаем приложение и запускаем его.
Что же внутри app.php:
А здесь подключаем автозагрузчик классов, созданный Composer, создаем приложение и настраиваем.
В controllers.php опишем логику контроллеров: $app->get(), $app->error() и тд.
Нас же интересует registers.php:
Согласно указанному namespace создадим директории, в данном случае:
Прийдется немного изменить код в консольных инструментов(дальше просто консоль) Doctrine, доступных, благодаря Composer в
Чтобы связать консоль и наше приложение настроим
Весь удаленный код создавал и настраивал то, что мы настроили для нашего приложения. Так почему бы нам это не использовать?
Тут стоит добавить, что работая в нашем приложении с Doctine, копию EntityManager мы сможем получить из
Что еще почитать по теме:
Русская документация по Doctrine
Английская документация по Doctrine ORM
UPD: Добавил на github репозиторий с каркасом приложения на silex и doctrine orm. Правда используется другой провайдр для 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();
Здесь мы в $app выгружаем приложение и запускаем его.
Что же внутри app.php:
// src/app.php
<?php
require __DIR__.'/../vendor/autoload.php';
$app = new Silex\Application();
$app['debug'] = true;
require __DIR__.'/registers.php';
require __DIR__.'/controllers.php';
return $app;
А здесь подключаем автозагрузчик классов, созданный Composer, создаем приложение и настраиваем.
В controllers.php опишем логику контроллеров: $app->get(), $app->error() и тд.
Нас же интересует registers.php:
// src/registers.php
<?php
use Doctrine\Common\Cache\ApcCache;
use Doctrine\Common\Cache\ArrayCache;
$app->register(new Silex\Provider\DoctrineServiceProvider(), 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 Nutwerk\Provider\DoctrineORMServiceProvider(), 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' => 'TestApp\Entity', // Пространство имен
)),
));
Согласно указанному 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 Symfony\Component\Console\Helper\HelperSet(array(
'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
));
Тут стоит добавить, что работая в нашем приложении с Doctine, копию EntityManager мы сможем получить из
$app['db.orm.em']
Варианты подключения этих настроек:
- Не правильный вариант, так делать не стоит:
Исправим bin/doctrine.php:
$configFile = getcwd() . DIRECTORY_SEPARATOR . 'bin/cli-config.php'; // 21 строка
Подобное можно было и не делать, поместив cli-config.php в корень проекта. С одной стороны не правильно править код библиотек, с другой — удобно. - Можно пойти и иным, более правильным путем — создать свою консоль и подключить свои конфиги самостоятельно:
// bin/console #!/usr/bin/env php <?php require 'cli-config.php'; include('doctrine.php');
Теперь надо дать права на исполнение bin/console и для запуска из корня проекта использовать:
./bin/console [command_name]
Что еще почитать по теме:
Русская документация по Doctrine
Английская документация по Doctrine ORM
UPD: Добавил на github репозиторий с каркасом приложения на silex и doctrine orm. Правда используется другой провайдр для ORM