Доработка модулей для Kohana – Doctrine и Doctrine Migrations

kohana doctrine

В виду того, что проект вообще закрылся и версию 3.4 c namespace мы наверное никогда не увидим следует вывод – не стоит начинать на ней новые проекты. Но что делать, если приходится поддерживать старые. Не пользоваться же Kohana, ее знание и знание ее особенностей уже ни кому не нужны. Значит надо подключить .

Я столкнулся с трудностями при решении такой простой задачи.
Существующие в не большом количестве модули не работают корректно или имеют баги. Так же я использую версию Kohana 3.2, что сразу же отсеивает половину модулей. Писать свое решение или делать downgrade с 3.3 версии было бы дольше. Все же я просмотрел все модули и нашел приемлемый.

Это был модуль Qballinternet/kohana-doctrine, который он форкнул от synchrone/kohana-doctrine, который тот форкнул от gimpe/kohana-doctrine, который и является первоначальным автором. Дело было 4 года назад.. А последний маинтайнер Qballinternet похоже тоже пропал (на связь не выходит, pull request не принимает).

Я взял версию с последнего форка и начал подключать и дорабатывать.

Модуль Doctrine

Адрес seyfer/kohana-doctrine.

Самый главный минус этого модуля до переделки был в том, что не используется composer и папка vendor с Doctrine просто закомичена с модулем вместе. Я решил избавиться сначала от лишнего и перейти на composer. Для этого я форкнул Qballinternet/kohana-doctrine, написал composer.json, удалил vendor который был в кеше git.
Дело еще в том, что в репозитории есть две ветки, одна под 3.2 версию, вторая под 3.3. И версия под 3.3 более доработанная, автор не повторял свои изменения на 3.2 версии. Я решил сначала перенять опыт, и перенести наработки с 3.3 ветки.
Пришлось поправить init.php модуля. Было:

Стало

Из нового тут это extensions_path и vendor_path в конфиге. Я указываю путь до vendor всего проекта, где уже установлена доктрина. Все же, учитывая PEAR стиль названия классов, я не стал делать этот модуль до конца package, и не заливал его в packagist. Подключаю я его прямо из git

В таком режиме подключения composer не читает composer.json пакета, который в данном случае такой.

С помощью параметра extensions_path я указываю путь расширений доктрины.
Длаее я перенес наработки с 3.3 для класса Doctrine_ORM. Это основной класс, который используется в клиентском коде. Главное, что я перенес, это метод instance(), делающий singleton реализацию. Без этого была высокая нагрузка на базу даннных, инициализация проходила при каждом вызове Doctrine_ORM.
Так же я внес свои правки. Добавил параметр debug в конфиг. Если ориентировать его на окружение, то в production возникает проблема с генерацией proxy доктрины.

Так же для метода $config->newDefaultAnnotationDriver() я установил использование SimpleAnnotationDriver в false. Иначе не срабатывает использование маппинга as ORM и не парсятся Entity. Так же в качестве проверки существаования классая установил class_exists(), т.к. у классов утсаревшее наименование.

Настройки подключения к базе данных берутся из стандартного database.php и так же они учитывают группу настроек, по умолчанию default.
Так же я добавил не большой фикс для типа sql – enum.

Еще я добавил методы, которые реализуют проверку подключения текущего EntityManager и его переподключение. Вслучае если при выполнении запроса к БД Doctrine выбрасывает Exception – подключение теряется. Тогда я пользуюсь этими методами.

Следующий файл, который я изменил, это doctrine/bin/doctrine.php
При вызове из консоли встает проблема определения путей к папкам system, application, modules. Они у меня не стандартные. Поэтому я просто добавил конфиг файл path.php

И используею его так.

Старый код я вынес в метод initLikeIndex(), он будет вызываться, если не сработает мой новый метод или нет конфига.
тут стоить пояснить строку с eval. Дело в том, что в конце файла index.php Kohana содержит по умолчанию строки

И при работе с миграциями (о них дальше) в консоль попадает html вывод. Я не нашел другого способа, кроме как считать этот файл и удалить эти строки, а потом сделать eval() вместо include index.php.

Как использовать модуль?

Подключить стандартным способом. Скопировать doctrine.php в свои конфиги, поменять если надо. Далее создаем папку по пути указанному в конфиге, у меня это APPPATH . ‘classes/doctrine/entity’. Даем права на запись на папку с proxy. Далее можно создавать entity, например

Так же создаем папку doctrine/repository и там создаем репозитории, если надо. У меня есть базовый класс репозитория, остальные наследуют от него.

В клиентском коде просто вызываем и пользуемся.

К сожалению мои правки последний автор не принимает и на связь не выходит. Значит у меня самая последняя версия.

Модуль Doctrine

Адрес seyfer/kohana-doctrinemigrations

С этим модулем несколько проще. Я форкнул его от synchrone/kohana-doctrinemigrations, который в свою очередь форкнул от synapsestudios/kohana-doctrinemigrations. Модуль так же создан 4 года назад.

С последним автором такая же беда. Не выходит на связь. Значит последние правки у меня.

Здесь я так же избавился от vendor в кеше и перешел на vendor проекта. Так же я добавил папку config, которая вообще отсутствовала. Идея этого модуля очень проста. Он зависит от kohana/doctrine описанного выше и просто регистрирует doctrine migration при инициализации. Так же регистрирует console_commands.
Файл init.php

Так же тут я дописал composer.json файл, просто чтобы описать пакет. Так же я добавил конфиг миграций config/migrations.xml, он указывает путь к папке, где они будут создаваться. Путь на чтение указан в конфиге.

Использование модуля описано в ридми, и оно такое.

Так же я пользуюсь им с параметром --filter-expression="*statistic*", это фильтрует к каким таблицам применить миграцию. Я делаю так, т.к. в моем старом проекте все сделано через Kohana ORM и я перехожу постепенно на Doctrine.

Испольуя модуль Doctrine я так же смог без труда сгенерировать все Entity на существующую базу.