Doctrine 2 is an object relational mapper (ORM) for PHP 5.3+ that sits on top of a powerful database abstraction layer (DBAL). One of its key features is the option to write database queries in a proprietary object oriented SQL dialect called Doctrine Query Language (DQL), inspired by Hibernates HQL. This provides developers with a powerful alternative to SQL that maintains flexibility without requiring unnecessary code duplication.
1. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Doctrine 2
Enterprise Persistence Layer for PHP 5.3
Big Lamp Camp 2009 #eLAMP
2. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Jonathan H. Wage
• Web developer for a decade
• Open Source Evangelist
• Published Author
• Contributes to...
• ...Doctrine
• ...Symfony
• ...and more
• Employee of Sensio Labs, the creators of
Symfony
Big Lamp Camp 2009 #eLAMP
3. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Jonathan H. Wage
• http://www.twitter.com/jwage
• http://www.jwage.com
• http://www.facebook.com/jwage
You can contact Jonathan about Doctrine and Open-Source or for
training, consulting, application development, or business related
questions at jonathan.wage@sensio.com
Big Lamp Camp 2009 #eLAMP
4. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
How many have used Doctrine?
• Before 1.0?
• 1.0?
• 1.1?
• 1.2?
• 2.0?
Big Lamp Camp 2009 #eLAMP
5. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Doctrine 1.0
• First commit April 13th 2006
• Finished and Released September 1st 2008
• One of the first true ORM implementation for PHP
• First LTS(long term support) release. Maintained
until March 1st 2010
• Integrated with many popular frameworks:
Symfony, Zend Framework, Code Igniter, etc.
Big Lamp Camp 2009 #eLAMP
6. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Doctrine 1.1
• Continued evolution of 1.0
• Dozens of small improvements
• Several significant new features
• Too many bug fixes to count
Big Lamp Camp 2009 #eLAMP
7. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Doctrine 1.2
• Last LTS release of the Doctrine 1.x series
• More bug fixes
• More improvements
• Even more new features
• Scheduled to release this month
Big Lamp Camp 2009 #eLAMP
8. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Doctrine 2.0
Big Lamp Camp 2009 #eLAMP
9. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Requires PHP 5.3
Big Lamp Camp 2009 #eLAMP
10. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Three Main Packages
Big Lamp Camp 2009 #eLAMP
11. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Common
Big Lamp Camp 2009 #eLAMP
12. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
DBAL
Big Lamp Camp 2009 #eLAMP
13. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
ORM
Big Lamp Camp 2009 #eLAMP
14. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Fully implements namespaces
Big Lamp Camp 2009 #eLAMP
15. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Namespaced Code
namespace DoctrineORM;
use DoctrineORMQueryExpr,
DoctrineCommonDoctrineException;
/**
* This class is responsible for building DQL query strings via an object oriented
* PHP interface.
*
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.doctrine-project.org
* @since 2.0
* @version $Revision$
* @author Guilherme Blanco <guilhermeblanco@hotmail.com>
* @author Jonathan Wage <jonwage@gmail.com>
* @author Roman Borschel <roman@code-factory.org>
*/
class QueryBuilder
{
Big Lamp Camp 2009 #eLAMP
16. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Using Namespaces
use DoctrineORMQueryBuilder;
$qb = new QueryBuilder($em);
$qb->select('u')
->from('ModelsUser', 'u')
->orderBy('u.username', 'ASC');
$q = $qb->getQuery();
$users = $q->execute();
Big Lamp Camp 2009 #eLAMP
18. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
What does this mean?
• PHP libraries will finally be 100% technically interoperable
and have optimum autoloading performance
• Symfony 2.0 + Doctrine 2.0 + Zend Framework 2.0
• Load classes from 3 different libraries with one
autoloader and one include path
• Share SplClassLoader implementation: http://
gist.github.com/221634
• Implement SplClassLoader in C/PHP :)
Big Lamp Camp 2009 #eLAMP
19. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Performance of PHP 5.3
Big Lamp Camp 2009 #eLAMP
20. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Doctrine 1 and 2 get significant
performance increase from 5.3
Big Lamp Camp 2009 #eLAMP
21. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
30% Less Memory Used
Big Lamp Camp 2009 #eLAMP
22. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
20% Faster
Big Lamp Camp 2009 #eLAMP
23. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
What’s my point?
USE PHP 5.3!
Big Lamp Camp 2009 #eLAMP
24. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Let the numbers talk
Doctrine 1.1
4.3 seconds for 5000 records
Doctrine 2.0
1.4 seconds for 5000 records
Doctrine 2.0
3.5 seconds for 10000 records
Big Lamp Camp 2009 #eLAMP
25. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Doctrine 2 is FAST!
Big Lamp Camp 2009 #eLAMP
26. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
The code isn’t that bad on the
eyes either
Big Lamp Camp 2009 #eLAMP
27. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Quit imposing on my
domain model!!
Big Lamp Camp 2009 #eLAMP
28. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
The Doctrine 1 Way
class User extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('id', 'integer', null, array(
'primary' => true,
'auto_increment' => true
));
$this->hasColumn('username', 'string', 255);
}
}
Big Lamp Camp 2009 #eLAMP
29. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
What is the problem?
• We have to extend Doctrine_Record
• It imposes methods, properties, and other
junk on our domain model objects
• We have to instantiate a dummy User in
order to instantiate the metadata for the
model
• Slow, ugly and just not pretty :)
Big Lamp Camp 2009 #eLAMP
30. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
The new Doctrine 2 Way
Specify mapping information with doc block
annotations, yaml, xml, or raw PHP code.
Big Lamp Camp 2009 #eLAMP
31. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
With Annotations
/**
* @Entity
* @Table(name="user")
*/
class User
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue(strategy="auto")
*/
public $id;
/**
* @Column(type="string", length=255)
*/
public $username;
}
Big Lamp Camp 2009 #eLAMP
32. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
With YAML
EntitiesUser:
type: entity
table: users
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
name:
type: string(50)
Big Lamp Camp 2009 #eLAMP
35. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
No more base class...
$user = new EntitiesUser();
$user->setUsername('jwage');
print_r($user);
User Object
(
[id] =>
[username] => jwage
)
...means a clean domain model
Big Lamp Camp 2009 #eLAMP
36. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Doctrine 2 is heavily decoupled
so you can use things standalone
Big Lamp Camp 2009 #eLAMP
37. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Use the DBAL without the ORM!
Big Lamp Camp 2009 #eLAMP
38. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Database Abstraction Layer
• The Doctrine DBAL is a very powerful
project in itself
• Based off of code borrowed from other
projects
• PEAR MDB2
• Zend_Db
Big Lamp Camp 2009 #eLAMP
39. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Database Abstraction Layer
• Using the Doctrine DBAL standalone is a
good option for your PHP projects if a fully
featured ORM is not needed
• API for performing DDL statements,
executing queries, etc.
• Connect to different types of databases:
mysql, sqlite, pgsql, oracle, etc.
Big Lamp Camp 2009 #eLAMP
40. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
DBAL Examples
Big Lamp Camp 2009 #eLAMP
41. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Create a Connection to MySQL
$params = array(
'driver' => 'pdo_mysql',
'host' => 'localhost',
'user' => 'root',
'password' => '',
'dbname' => 'doctrine2dbal'
);
$conn = DoctrineDBALDriverManager::getConnection($params);
Big Lamp Camp 2009 #eLAMP
42. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Get the Schema Manager
$sm = $conn->getSchemaManager();
Big Lamp Camp 2009 #eLAMP
43. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Schema Manager
• Issue DDL statements through intuitive API:
createTable(), dropTable(),
createForeignKey(), etc.
• Introspect your database schema as well:
listTables(), listTableColumns(), listUsers(),
etc.
Big Lamp Camp 2009 #eLAMP
46. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
So much more...
• Fully featured DBAL for manipulating your
database with DDL statements
• Introspect your database and learn about it
• Execute queries and retrieve data
• Support for transactions
Big Lamp Camp 2009 #eLAMP
47. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
The ORM Key Feature
Big Lamp Camp 2009 #eLAMP
48. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Doctrine Query
Language
Big Lamp Camp 2009 #eLAMP
49. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
DQL stands for Doctrine Query
Language and is heavily
influenced by HQL from Hibernate
Big Lamp Camp 2009 #eLAMP
51. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
The DQL is parsed by a
hand written recursive
descent parser
Big Lamp Camp 2009 #eLAMP
52. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Constructs AST
Big Lamp Camp 2009 #eLAMP
53. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
AST = Abstract Syntax Tree
Big Lamp Camp 2009 #eLAMP
54. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Tree representation of the
syntactic structure of a source
language
Big Lamp Camp 2009 #eLAMP
55. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
PHP class names of DQL parser directly
represent the language itself
OrderByClause.php
SelectClause.php
SelectExpression.php
Subselect.php
DeleteClause.php
etc. etc.
Big Lamp Camp 2009 #eLAMP
56. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Every DQL feature has a
class to handle the parsing
Big Lamp Camp 2009 #eLAMP
57. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
• Easy to use
• Easy to expand and add new features
• Easy to use and understand the parsing of a
DQL string
• Expand the DQL parser with your own
functionality and add to the DQL language
Big Lamp Camp 2009 #eLAMP
58. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
DQL parser is very fast as it is.
With final SQL caching it
becomes invisible.
Big Lamp Camp 2009 #eLAMP
59. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Sample DQL Query
$query = $em->createQuery(
'SELECT u, g, FROM User u ' .
'LEFT JOIN u.Groups g ' .
'ORDER BY u.name ASC, g.name ASC'
);
$users = $query->execute();
Big Lamp Camp 2009 #eLAMP
60. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Using the QueryBuilder
$qb = $em->createQueryBuilder()
->select('u, g')
->from('User', 'u')
->leftJoin('u.Groups', 'g')
->orderBy('u.name', 'ASC')
->addOrderBy('g.name', 'ASC');
$query = $qb->getQuery();
Big Lamp Camp 2009 #eLAMP
61. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Executing Queries
$users = $query->execute();
foreach ($users as $user) {
// ...
foreach ($user->getGroups() as $group) {
// ...
}
}
Big Lamp Camp 2009 #eLAMP
62. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Working with Entities
Big Lamp Camp 2009 #eLAMP
63. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
The EntityManager
Big Lamp Camp 2009 #eLAMP
64. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
The EntityManager is
responsible for managing
the persistence of entities
Big Lamp Camp 2009 #eLAMP
68. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
EntityManager::flush()
• Commits any changes to the managed
entities
• Efficiently executes insert, update and
delete statements
• Keep number of flush() operations down to
about 1-2 times per request
Big Lamp Camp 2009 #eLAMP
69. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
The EntityManager::flush()
operation is able to insert,
update and delete entities very
efficiently. It is ideal to keep
your flush operations to about
1-2 times per request
Big Lamp Camp 2009 #eLAMP
70. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Metadata Cache
$config = new DoctrineORMConfiguration();
$config->setMetadataCacheImpl(new DoctrineCommonCacheApcCache);
Big Lamp Camp 2009 #eLAMP
71. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
In production cache the
ClassMetadata instances
populated by the parsed
annotations, yaml, xml, etc.
Big Lamp Camp 2009 #eLAMP
72. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Query Cache
$config->setQueryCacheImpl(new DoctrineCommonCacheApcCache);
Big Lamp Camp 2009 #eLAMP
73. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
In production cache the parsing
of a DQL query and the final SQL
generated.
Big Lamp Camp 2009 #eLAMP
74. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Result Cache
$config->setResultCacheImpl(new DoctrineCommonCacheApcCache);
Big Lamp Camp 2009 #eLAMP
75. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
In production cache the hydrated
data of your queries to avoid
unnecessary queries to the
database.
Big Lamp Camp 2009 #eLAMP
76. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Using Result Cache
$query = $em->createQuery('SELECT u FROM ModelsUser u')
$query->useResultCache(true, 3600, 'user_query');
$users = $query->execute();
Execute it again and it pulls the results from
the cache instead of hitting the database
$users = $query->execute();
Big Lamp Camp 2009 #eLAMP
77. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Using Result Cache The parsing of this
query will only ever happen
once with the query cache
configured.
$query = $em->createQuery('SELECT u FROM ModelsUser u')
$query->useResultCache(true, 3600, 'user_query');
$users = $query->execute();
Execute it again and it pulls the results from
the cache instead of hitting the database
$users = $query->execute();
Big Lamp Camp 2009 #eLAMP
78. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Inheritance Mapping
Big Lamp Camp 2009 #eLAMP
79. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Mapped Superclasses
Big Lamp Camp 2009 #eLAMP
80. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
/** @MappedSuperclass */
abstract class MappedSuperclassBase
{
/** @Column(type="integer") */
private $mapped1;
/** @Column(type="string") */
private $mapped2;
/**
* @OneToOne(targetEntity="MappedSuperclassRelated1")
* @JoinColumn(name="related1_id", referencedColumnName="id")
*/
private $mappedRelated1;
// ... more fields and methods
}
Big Lamp Camp 2009 #eLAMP
81. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Extend the Superclass
Big Lamp Camp 2009 #eLAMP
82. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
/** @Entity */
class EntitySubClass extends MappedSuperclassBase
{
/** @Id @Column(type="integer") */
private $id;
/** @Column(type="string") */
private $name;
// ... more fields and methods
}
Big Lamp Camp 2009 #eLAMP
83. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Single Table Inheritance
Big Lamp Camp 2009 #eLAMP
84. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
/**
* @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discriminator", type="string")
* @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
*/
class Person
{
// ...
}
/**
* @Entity
*/
class Employee extends Person
{
// ...
}
Big Lamp Camp 2009 #eLAMP
85. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Single Table
• All classes of a hierarchy are mapped to a
single table
• Discriminator column used to distinguish
type of a row in the database
• Efficient for querying across all types in the
hierarchy or for specific types.
• Queries limited by type discriminator
Big Lamp Camp 2009 #eLAMP
86. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Class Table Inheritance
Big Lamp Camp 2009 #eLAMP
87. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
/**
* @Entity
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
*/
class Person
{
// ...
}
/** @Entity */
class Employee extends Person
{
// ...
}
Big Lamp Camp 2009 #eLAMP
88. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Class Table
• Each class in a hierarchy is mapped to
several tables
• Table of a child class is linked to the table
of a parent class
• Discriminator column used to distinguish
type of a row in the database
• Queries almost always require joins
Big Lamp Camp 2009 #eLAMP
89. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Testing
Big Lamp Camp 2009 #eLAMP
90. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
PHPUnit for Unit Testing
Big Lamp Camp 2009 #eLAMP
92. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Sismo for Continuous Integration
Big Lamp Camp 2009 #eLAMP
93. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Big Lamp Camp 2009 #eLAMP
94. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Big Lamp Camp 2009 #eLAMP
95. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Growl Notifications
Big Lamp Camp 2009 #eLAMP
96. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Sismo keeps a close eye on all of our
projects. We even run the Doctrine 2 tests
against multiple supported databases.
Big Lamp Camp 2009 #eLAMP
97. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Custom Types
Big Lamp Camp 2009 #eLAMP
98. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
namespace DoctrineDBALTypes;
class MyCustomObjectType extends Type
{
public function getName()
{
return 'MyCustomObjectType';
}
public function getSqlDeclaration(array $fieldDeclaration,
DoctrineDBALPlatformsAbstractPlatform $platform)
{
return $platform->getClobDeclarationSql($fieldDeclaration);
}
public function convertToDatabaseValue($value,
DoctrineDBALPlatformsAbstractPlatform $platform)
{
return serialize($value);
}
public function convertToPHPValue($value)
{
return unserialize($value);
}
}
Big Lamp Camp 2009 #eLAMP
99. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Type::addCustomType(
'MyCustomObjectType',
'DoctrineDBALTypesMyCustomObjectType'
);
Big Lamp Camp 2009 #eLAMP
100. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Override Types
Big Lamp Camp 2009 #eLAMP
101. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
class MyString extends StringType
{
}
Type::overrideType('string', 'DoctrineDBALTypesMyString');
Big Lamp Camp 2009 #eLAMP
102. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Thanks!!
Big Lamp Camp 2009 #eLAMP
103. Doctrine 2: Enterprise Persistence Layer for PHP 5.3 www.doctrine-project.org www.sensiolabs.com
Jonathan H. Wage
jonathan.wage@sensio.com
+1 415 992 5468
sensiolabs.com | doctrine-project.org | sympalphp.org | jwage.com
You can contact Jonathan about Doctrine and Open-Source or
for training, consulting, application development, or business
related questions at jonathan.wage@sensio.com
Big Lamp Camp 2009 #eLAMP