Zend Framework и Doctrine Степан Танасийчук [email_address]
Чем я занимаюсь? Web разработкой занялся в 2003 году
С Zend Framework начал работать в 2008 году
Руковожу собственной веб-студией с 2009 года
Активный участник сообщества zendframework.ru
Люблю прикольные смайлы :]
Содержание доклада Подключение Doctrine к ZF проекту
Скрипт для работы с Doctrine_Cli
Генерация моделей по YAML схемам
Механизм миграций
Наследование в моделях
Шаблоны расширений
Адаптер для Zend_Auth
Адаптер для Zend_Paginator
ZFEngine и использование Doctrine в модульном ZF приложении
Несколько слов о Doctrine ORM библиотека для PHP 5.2.3+
Использует паттерны Active Record, Data Mapper и Metadata Mapping
Собственный язык запросов — DQL (по мотивам HQL)
Связи один-к-одному, один-ко-многим и многие-к-многим
Автогенерация моделей по yaml схемам
Экспорт и импорт из/в yaml
Механизм миграций
Шаблоны поведений (l18n, Versionable, NestedSet, etc.)
Подключаем Doctrine к ZF проекту Размещаем Doctrine в library/Doctrine:
$   svn export http://svn.doctrine-project.org/tags/1.2.1/lib/Doctrine/ ./library/Doctrine
Прописываем следующие настройки в application.ini:
autoloadernamespaces[] =  "Doctrine"
Parables_Application_Resource_Doctrine Matthew Lurz  добавил в Zend Framework proposal application-ресурс для подключения Doctrine.  Его класс называется  Parables_Application_Resource_Doctrine  и лежит здесь  http://github.com/mlurz71/parables
ZFEngine_Application_Resource_Doctrine Мы немного изменили код  Parables_Application_Resource_Doctrine  для работы с Doctrine 1.2.x и храним его в репозитории ZFEngine как  ZFEngine_Application_Resource_Doctrine ZFEngine это сборная солянка классов, которые мы используем при разработке проектов на ZF. Лежит все здесь:  http://zfengine.com В основном код наш. Также есть чужой, но с некоторыми изменениями. Надеюсь, что это все в рамках закона ^_~.
Подключаем ZFEngine к ZF проекту Размещаем ZFEngine в library/ZFEngine:
$  svn export http://svn2.assembla.com/svn/zfengine/trunk/library/ZFEngine/ ./library/ZFEngine
Прописываем следующие настройки в application.ini:
autoloadernamespaces[] =  "ZFEngine"
pluginPaths.ZFEngine_Application_Resource =  "ZFEngine/Application/Resource"
Настраиваем подключение к БД resources.doctrine.connections.primary.dsn.adapter =  "mysql" resources.doctrine.connections.primary.dsn.username =  "root" resources.doctrine.connections.primary.dsn.password =  "******" resources.doctrine.connections.primary.dsn.host =  "localhost" resources.doctrine.connections.primary.dsn.dbname =  "zfconf" resources.doctrine.connections.primary.options.charset =  "utf8" resources.doctrine.connections.primary.options.collate =  "utf8_unicode_ci"
Настраиваем  Doctrine_Manager resources.doctrine.manager.attributes.attr_autoload_table_classes =  1 resources.doctrine.manager.attributes.attr_use_native_enum =  1 resources.doctrine.manager.attributes.attr_quote_identifier =  1 resources.doctrine.manager.attributes.attr_auto_free_query_objects =  1 resources.doctrine.manager.attributes.attr_auto_accessor_override =  1 resources.doctrine.manager.attributes.attr_model_loading =  "model_loading_conservative"
MODEL_LOADING_PEAR В Doctrine 1.2 появился новый режим для автозагрузки моделей  —   MODEL_LOADING_PEAR , но при использовании этого режима не работает generate-migration-diff :(. Я заметил это уже в процессе подготовки доклада и пока просто написал в багрепорт Doctrine.
Для проектов с НЕмодульной структурой Указываем путь к директории с моделями:
resources.doctrine.manager.models_path = APPLICATION_PATH "/models"
Настраиваем кеширование resources.doctrine.manager.*
.attributes.attr_result_cache.driver =  "memcache"
.attributes.attr_result_cache.lifespan =  3600
.attributes.attr_result_cache.options.servers.host =  "localhost"
.attributes.attr_result_cache.options.servers.port =  11211
.attributes.attr_result_cache.options.servers.persistent =  1
.attributes.attr_result_cache.options.compression =  0
Настраиваем Doctrine_Cli doctrine_cli.data_fixtures_path =  APPLICATION_PATH "/configs/doctrine/data/fixtures" doctrine_cli.models_path =  APPLICATION_PATH "/models" doctrine_cli.migrations_path =  APPLICATION_PATH "/configs/doctrine/migrations" doctrine_cli.sql_path =  APPLICATION_PATH "/configs/doctrine/data/sql" doctrine_cli.yaml_schema_path =  APPLICATION_PATH "/configs/doctrine/schema" doctrine_cli.generate_models_options.generateBaseClasses =  1 doctrine_cli.generate_models_options.baseClassesDirectory =  "Base" doctrine_cli.generate_models_options.generateTableClasses =  1
Cкрипт для работы с Doctrine_Cli ./application/sripts/common.php <?php define( 'APPLICATION_ENV' ,  'development' ); define( 'APPLICATION_PATH' , realpath(dirname(__FILE__) .  '/..' )); set_include_path(implode(PATH_SEPARATOR,  array ( realpath(APPLICATION_PATH .  '/../library' ), get_include_path(), )));
Cкрипт для работы с Doctrine_Cli ./application/sripts/doctrine #!/usr/bin/env php <?php require_once   'common.php' ; require_once   'Zend/Application.php' ; $application  =  new  Zend_Application( APPLICATION_ENV, APPLICATION_PATH .  '/configs/application.ini' ); $application ->getBootstrap() ->bootstrap(); $cli  =  new  Doctrine_Cli( $application ->getOption( 'doctrine_cli' )); $cli ->run($_SERVER[ 'argv' ]);
Проверяем как работает Запускаем скрипт без параметров:
$   ./application/sripts/doctrine
Doctrine Command Line Interface
./application/sripts/doctrine generate-sql
./application/sripts/doctrine create-db
./application/sripts/doctrine generate-yaml-models
./application/sripts/doctrine dql
./application/sripts/doctrine generate-migrations-models
./application/sripts/doctrine generate-yaml-db
./application/sripts/doctrine generate-models-yaml
./application/sripts/doctrine generate-migrations-diff

ZFConf 2010: Zend Framework and Doctrine