Doctrine
Doctrine — це бібліотека ORM. По MVC-паттерну код генерований за допомогою Doctrine можна дуже класно використовувати замість kohana ORM або кастомних моделей. Доктрина має ряд няшок, якими б хотілось скористуватись:
- Автоматична генерація моделей. Потім дуже зручно їх міняти, бо створюється спеціально доктриновський клас від якого наслідується вже ваш, який власне і міняємо.
- Можливість задавати базу і моделі за допомогою yaml, що є дуже зручно і зрозуміло. SQL створення бази генерується, моделі генеруються, всьо добре.
- Решту няшок просто пронумерую: раз два три.
Скачати.
Kohana 3
Kohana 3, як показує ссилка ось-ось зарелізиться, але проекти не чекають. Щоб йти в ногу з технологіями потрібно приймати ризиковані новаторські рішення. Більше того, по моїм перечитуванням коду реліз кандидату склалось дуже приємне враження, оптимізували і дуже спростили ядро, не втрачаючи необхідного функціоналу звісно. Скачати останню версію.
Процедура
Власне нам потрібно створити модуль kohana, який буде в собі включати доктріну. Відволікатись на таку просту процедуру ми не будемо, в нас doctrine буде лежати в… ну з конфіга буде краще видно я думаю.
Kohana::modules(array(
// 'database' => MODPATH.'database', Database
// 'kodoc' => MODPATH.'kodoc', // Kohana documentation
// 'orm' => MODPATH.'orm', // Object Relationship Mapping (not complete)
'auth' => MODPATH.'auth', // Database access
'pagination' => MODPATH.'pagination', // Paging of results
'image' => MODPATH.'image', // Image manipulation
'doctrine' => MODPATH.'doctrine', // Doctrine ORM
);
Ми виключаємо рідний kohana orm і ActiveRecord і підключаємо натомість doctrine. Далі в папці з модулем доктріни ложимо файлик init.php (вот за що я люблю kohana, тут всьо продумано) з наступним вмістом.
<?php
/* Doctrine integration */
require Kohana::find_file('classes', 'doctrine/Doctrine');
/* Реєструємо аутолоадер. Після розробки доктріну можна скомпілити в один файл
* розміров 800кб правда. Не думаю шо там можна шось сильно оптимізувати.
* Суть в тому, що треба виключити буде аутолоадер. якщо буде скомпілений файл.
*/
spl_autoload_register(array('Doctrine', 'autoload'));
// Читаємо конфіги для конекту з базою даних
$db = Kohana::config('database')->doctrine;
// Получаємо менеджер доктріни
$manager = Doctrine_Manager::getInstance();
//Створюємо конект
$manager->connection('mysql://'.$db['user'].':'.$db['password'].'@'.$db['host'].'/'.$db['database'], 'default_connection');
// @see http://www.doctrine-project.org/documentation/manual/1_1/en/configuration
$manager->setAttribute(Doctrine::ATTR_MODEL_LOADING, Doctrine::MODEL_LOADING_CONSERVATIVE);
$manager->setAttribute(Doctrine::ATTR_VALIDATE, Doctrine::VALIDATE_ALL);
$manager->setAttribute(Doctrine::ATTR_DEFAULT_IDENTIFIER_OPTIONS, array('name' => '%s_id', 'type' => 'int', 'length' => 11));
$manager->setAttribute(Doctrine::ATTR_PORTABILITY, Doctrine::PORTABILITY_ALL);
$manager->setAttribute(Doctrine::ATTR_QUOTE_IDENTIFIER, true);
$manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_ALL);
$manager->setAttribute(Doctrine::ATTR_TBLNAME_FORMAT, $db['prefix'].'_%s');
$manager->setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true);
// Доктринові моделі будуть лежати не в classes/ а окремо в MODPATH
Doctrine::loadModels(APPPATH.'models');
Вроді все прокоментовано. Єдине запитання може виникати до конфігураційного файла бази даних. Вот доречі і він:
<?php
return array(
'doctrine' => array(
'user' => 'username',
'password' => 'supersecretpasword',
'host' => 'localhost',
'database' => 'fancy_site',
'prefix' => 'wtfpl',
)
);
Отак отримуємо інтегровану Doctrine в kohana. Опісля, якщо у вас з модулями йдуть моделі доктрини, то в тому ж init.php ставимо наступне:
Doctrine::loadModels(MODPATH.'blog/models');
для модуля блогу наприклад ;)
Бонус
Також викладаю вам спеціально драйвер бібліотеки Auth для використання з doctrine. Розібратись де його поставити зовсім не важко (правда я півдня думав чи його пхати до auth чи до doctrine). Да, ще одне, використовуючи бібліотеку авторизації треба уважно слідкувати за цією сторіночкою.
Код драйвера власне тут. Я думаю резонно його включити в модуль auth, хоча б для того, щоб якщо хтось ще задастся таким питанням, то зможе використати. Да, драйвер ще не тестований, тому можуть бути очевидні завтики, але походу реалізований.