SlideShare a Scribd company logo
Doctrine 2
Шатов Максим
Разработчик
Maxim.Shatov@softline.ru
2013.01.25
Doctrine 2 состоит из трех основных библиотек

Common
общие компоненты, которые используются в других
библиотеках/пакетах

DBAL
слой абстракции от БД

ORM
инструменты объектно-реляционного отображения
Doctrine Common

Загрузчик классов
основан на широко используемых соглашениях о пространствах имен,
имен классов и структуре каталогов

Аннотации
аннотации в стиле DocBlock к классам PHP

Кеширование
«из коробки» доступны:
ApcCache, ArrayCache, FilesystemCache, FilesystemCache,
MemcachedCache, PhpFileCache, RedisCache, WinCacheCache,
XcacheCache, ZendDataCache
Аннотации

namespace Entities;
/**
* @Entity @Table(name="users")
*/
class User
{
/** @Id @Column(type="integer") @GeneratedValue */
private $id;
/** @Column(length=50) */
private $name;
/** @OneToOne(targetEntity="Address") */
private $address;
}
Doctrine DBAL

Конструктор запросов
Управление транзакциями
Менеджер схемы БД
Менеджер событий
Обеспечение безопасности
(защита от sql-инъекций)

Поддержка различных БД
Кеширование
Doctrine ORM

Позволяет отображать объекты PHP в таблицы
базы данных
Использование аннотаций, XML или YAML для
метаданных
Связи между объектами отображаются как
внешние ключи
Отношение объекта ко многим обрабатывается
как коллекция
Выборка из базы данных при помощи
менеджера объектов, репозитория или
запроса любой сложности на языке
DQL(Doctrine Query Language)
Интерфейс командной строки

Создание «геттеров» и «сеттеров»
Создание таблиц/схемы для БД
Миграции
Фикстуры
Импорт отображения объектов из существующей
базы данных
Очистка кеша метаданных/запросов/результатов
Выполнение запросов
Отображение объектов в базу данных

Отображаются
Объекты
Связи
Отношения
наследование/суперклассы, переопределение
связей/полей

Способы задания
Аннотации
XML
YAML
PHP
Использование суперклассов и подклассов

/** @MappedSuperclass */
class MappedSuperclassBase
{
/** @Column(type="integer") */
private $mapped1;
/** @Column(type="string") */
private $mapped2;
/**
* @OneToOne(targetEntity="SuperclassRelated1")
* @JoinColumn(name="related1_id",
referencedColumnName="id")
*/
private $mappedRelated1;
// ... more fields and methods
}
Использование суперклассов и подклассов

/** @Entity */
class EntitySubClass extends MappedSuperclassBase
{
/** @Id @Column(type="integer") */
private $id;
/** @Column(type="string") */
private $name;
// ... more fields and methods
}
Наследование с использованием дискриминаторов

/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"person" = "Person", "employee" =
"Employee"})
*/
class Person
{
// ...
}
/**
* @Entity
*/
class Employee extends Person
{
// ...
}
Работа с объектами

Базовое
Сущности
Связи
События

Запросы
DQL
Конструктор запросов
Нативный SQL

Внутренняя структура
Отслеживание изменения объектов
Несколько слоёв ORM
Двунаправленные связи
Обновление связанных объектов
Вставка записей используя Doctrine

for ($i = 0; $i < 20; ++$i) {
$user = new User;
$user->name = 'Иванов А.Д.';
$em->persist($user);
}
$s = microtime(true);
$em->flush();
$e = microtime(true);
echo $e - $s;
Вставка записей используя «сырой» код PHP

$s = microtime(true);
for ($i = 0; $i < 20; ++$i) {
mysql_query("INSERT INTO users (name) VALUES
('Иванов А.Д.')");
}
$e = microtime(true);
echo $e - $s;
Сравнение результатов

Doctrine 2 0.0094 секунд
mysql_query 0.0165 секунд
Вставка записей используя «сырой» код PHP v2

$s = microtime(true);
mysql_query('START TRANSACTION');
for ($i = 0; $i < 20; ++$i) {
mysql_query("INSERT INTO users (name) VALUES
('Иванов А.Д.')");
}
mysql_query('COMMIT');
$e = microtime(true);
echo $e - $s;
0.0028 секунд
Жизненный цикл и обработчики событий

preRemove
postRemove
prePersist
postPersist
preUpdate
postUpdate
postLoad
loadClassMetadata
/** @Entity @HasLifecycleCallbacks */
class User {
/**
* @Column(type="string", length=255)
*/
public $value;
/** @PrePersist */
public function doStuffOnPrePersist() {
$this->value = date('Y-m-d H:m:s');
}
/** @PrePersist */
public function doOtherStuffOnPrePersist() {
$this->value = 'changed from prePersist callback!';
}
/** @PostLoad */
public function doStuffOnPostLoad() {
$this->value = 'changed from postLoad callback!';
}
}
Спасибо за внимание!
Вопросы?

More Related Content

What's hot

MySQL
MySQLMySQL
MySQL
Noveo
 
Entity возрождение легенды. Исай Руслан
Entity возрождение легенды. Исай РусланEntity возрождение легенды. Исай Руслан
Entity возрождение легенды. Исай Руслан
DrupalSib
 
Making Scalable JavaScript Application
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript ApplicationMikhail Davydov
 
Лекция #7. Django ORM
Лекция #7. Django ORMЛекция #7. Django ORM
Лекция #7. Django ORM
Яковенко Кирилл
 
Основы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статикаОсновы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статика
Sergey Nemchinsky
 
Java весна 2013 лекция 8
Java весна 2013 лекция 8Java весна 2013 лекция 8
Java весна 2013 лекция 8Technopark
 
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
CocoaHeads
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»e-Legion
 
Master class bars group ext js4
Master class bars group   ext js4Master class bars group   ext js4
Master class bars group ext js4Radik Fattakhov
 
Василий Захарченко: "Взгляд на queryDsl-sql фреймворк как альтернатива Hiber...
Василий Захарченко: "Взгляд на  queryDsl-sql фреймворк как альтернатива Hiber...Василий Захарченко: "Взгляд на  queryDsl-sql фреймворк как альтернатива Hiber...
Василий Захарченко: "Взгляд на queryDsl-sql фреймворк как альтернатива Hiber...
Provectus
 
Java осень 2012 лекция 7
Java осень 2012 лекция 7Java осень 2012 лекция 7
Java осень 2012 лекция 7Technopark
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
Noveo
 
Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...
 Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат... Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...
Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...
it-people
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7
Technopark
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
Яковенко Кирилл
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSГлеб Тарасов
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
CocoaHeads
 

What's hot (20)

OOP in PHP (ru)
OOP in PHP (ru)OOP in PHP (ru)
OOP in PHP (ru)
 
MySQL
MySQLMySQL
MySQL
 
Entity возрождение легенды. Исай Руслан
Entity возрождение легенды. Исай РусланEntity возрождение легенды. Исай Руслан
Entity возрождение легенды. Исай Руслан
 
Making Scalable JavaScript Application
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript Application
 
Лекция #7. Django ORM
Лекция #7. Django ORMЛекция #7. Django ORM
Лекция #7. Django ORM
 
Основы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статикаОсновы Java. 3. Конструкторы, уровни доступа, статика
Основы Java. 3. Конструкторы, уровни доступа, статика
 
Java весна 2013 лекция 8
Java весна 2013 лекция 8Java весна 2013 лекция 8
Java весна 2013 лекция 8
 
PGDBObject
PGDBObjectPGDBObject
PGDBObject
 
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
 
Master class bars group ext js4
Master class bars group   ext js4Master class bars group   ext js4
Master class bars group ext js4
 
Василий Захарченко: "Взгляд на queryDsl-sql фреймворк как альтернатива Hiber...
Василий Захарченко: "Взгляд на  queryDsl-sql фреймворк как альтернатива Hiber...Василий Захарченко: "Взгляд на  queryDsl-sql фреймворк как альтернатива Hiber...
Василий Захарченко: "Взгляд на queryDsl-sql фреймворк как альтернатива Hiber...
 
Java осень 2012 лекция 7
Java осень 2012 лекция 7Java осень 2012 лекция 7
Java осень 2012 лекция 7
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...
 Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат... Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...
Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
DBIx::Class
DBIx::ClassDBIx::Class
DBIx::Class
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 

Similar to Doctrine 2

Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8
Technopark
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4Technopark
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEB
Alexandre Kalendarev
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
Igor Shkulipa
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
Noveo
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
Igor Shkulipa
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)
Fedor Malyshkin
 
LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)
Sergey Skvortsov
 
Lec 2
Lec 2Lec 2
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Javaitc73
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
muqaddas_m
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Dev_Party
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9Technopark
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Метапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptМетапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScript
Timur Shemsedinov
 

Similar to Doctrine 2 (20)

Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEB
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Backbone js
Backbone jsBackbone js
Backbone js
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)
 
LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)
 
DBIx Class
DBIx ClassDBIx Class
DBIx Class
 
Lec 2
Lec 2Lec 2
Lec 2
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Java
 
Lecture 3
Lecture 3Lecture 3
Lecture 3
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
Метапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptМетапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScript
 

Doctrine 2

  • 2. Doctrine 2 состоит из трех основных библиотек Common общие компоненты, которые используются в других библиотеках/пакетах DBAL слой абстракции от БД ORM инструменты объектно-реляционного отображения
  • 3. Doctrine Common Загрузчик классов основан на широко используемых соглашениях о пространствах имен, имен классов и структуре каталогов Аннотации аннотации в стиле DocBlock к классам PHP Кеширование «из коробки» доступны: ApcCache, ArrayCache, FilesystemCache, FilesystemCache, MemcachedCache, PhpFileCache, RedisCache, WinCacheCache, XcacheCache, ZendDataCache
  • 4. Аннотации namespace Entities; /** * @Entity @Table(name="users") */ class User { /** @Id @Column(type="integer") @GeneratedValue */ private $id; /** @Column(length=50) */ private $name; /** @OneToOne(targetEntity="Address") */ private $address; }
  • 5. Doctrine DBAL Конструктор запросов Управление транзакциями Менеджер схемы БД Менеджер событий Обеспечение безопасности (защита от sql-инъекций) Поддержка различных БД Кеширование
  • 6. Doctrine ORM Позволяет отображать объекты PHP в таблицы базы данных Использование аннотаций, XML или YAML для метаданных Связи между объектами отображаются как внешние ключи Отношение объекта ко многим обрабатывается как коллекция Выборка из базы данных при помощи менеджера объектов, репозитория или запроса любой сложности на языке DQL(Doctrine Query Language)
  • 7. Интерфейс командной строки Создание «геттеров» и «сеттеров» Создание таблиц/схемы для БД Миграции Фикстуры Импорт отображения объектов из существующей базы данных Очистка кеша метаданных/запросов/результатов Выполнение запросов
  • 8. Отображение объектов в базу данных Отображаются Объекты Связи Отношения наследование/суперклассы, переопределение связей/полей Способы задания Аннотации XML YAML PHP
  • 9. Использование суперклассов и подклассов /** @MappedSuperclass */ class MappedSuperclassBase { /** @Column(type="integer") */ private $mapped1; /** @Column(type="string") */ private $mapped2; /** * @OneToOne(targetEntity="SuperclassRelated1") * @JoinColumn(name="related1_id", referencedColumnName="id") */ private $mappedRelated1; // ... more fields and methods }
  • 10. Использование суперклассов и подклассов /** @Entity */ class EntitySubClass extends MappedSuperclassBase { /** @Id @Column(type="integer") */ private $id; /** @Column(type="string") */ private $name; // ... more fields and methods }
  • 11. Наследование с использованием дискриминаторов /** * @Entity * @InheritanceType("SINGLE_TABLE") * @DiscriminatorColumn(name="discr", type="string") * @DiscriminatorMap({"person" = "Person", "employee" = "Employee"}) */ class Person { // ... } /** * @Entity */ class Employee extends Person { // ... }
  • 12. Работа с объектами Базовое Сущности Связи События Запросы DQL Конструктор запросов Нативный SQL Внутренняя структура Отслеживание изменения объектов Несколько слоёв ORM Двунаправленные связи Обновление связанных объектов
  • 13. Вставка записей используя Doctrine for ($i = 0; $i < 20; ++$i) { $user = new User; $user->name = 'Иванов А.Д.'; $em->persist($user); } $s = microtime(true); $em->flush(); $e = microtime(true); echo $e - $s;
  • 14. Вставка записей используя «сырой» код PHP $s = microtime(true); for ($i = 0; $i < 20; ++$i) { mysql_query("INSERT INTO users (name) VALUES ('Иванов А.Д.')"); } $e = microtime(true); echo $e - $s;
  • 15. Сравнение результатов Doctrine 2 0.0094 секунд mysql_query 0.0165 секунд
  • 16. Вставка записей используя «сырой» код PHP v2 $s = microtime(true); mysql_query('START TRANSACTION'); for ($i = 0; $i < 20; ++$i) { mysql_query("INSERT INTO users (name) VALUES ('Иванов А.Д.')"); } mysql_query('COMMIT'); $e = microtime(true); echo $e - $s; 0.0028 секунд
  • 17. Жизненный цикл и обработчики событий preRemove postRemove prePersist postPersist preUpdate postUpdate postLoad loadClassMetadata
  • 18. /** @Entity @HasLifecycleCallbacks */ class User { /** * @Column(type="string", length=255) */ public $value; /** @PrePersist */ public function doStuffOnPrePersist() { $this->value = date('Y-m-d H:m:s'); } /** @PrePersist */ public function doOtherStuffOnPrePersist() { $this->value = 'changed from prePersist callback!'; } /** @PostLoad */ public function doStuffOnPostLoad() { $this->value = 'changed from postLoad callback!'; } }

Editor's Notes

  1. &lt;номер&gt;