Nashville LAMP
What is Doctrine?
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Doctrine is a ORM
written in PHP
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
What is an ORM?
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
ORM stands for
Object Relational Mapper
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Manipulate RDBMS
as a set of PHP objects
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Easy to get started
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Doctrine Sandbox
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Doctrine Sandbox
$ svn co http://svn.doctrine-project.org/branches/1.1 lamp_doctrine
$ cd lamp_doctrine/tools/sandbox
$ php doctrine.php
Command Line
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Test Data
lamp_doctrine/tools/sandbox/data/fixtures/data.yml
User:
jwage:
first_name: Jonathan
last_name: Wage
username: jwage
password: changeme
email_address: jonathan.wage@sensio.com
Phonenumbers:
cell:
phonenumber: 6155139185
office:
phonenumber: 4159925468
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Build All Reload
$ php doctrine.php build-all-reload
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Running Tests
• First DQL Query
• Working with objects
• Writing DQL Queries
– SELECT queries
– UPDATE queries
– DELETE queries
• Custom Accessors/Mutators
• Using Migrations
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
First DQL Query
$ php doctrine.php dql quot;FROM User u, u.Phonenumbers pquot;
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Working with Objects
lamp_doctrine/tools/sandbox/index.php
Insert new User
$user = new User();
$user->first_name = 'Fabien';
$user->last_name = 'Potencier';
$user->username = 'fabpot';
$user->password = 'changeme';
$user->email_address = 'fabien.potencier@sensio.com';
$user->save();
$ php index.php
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Working with Objects
lamp_doctrine/tools/sandbox/index.php
Edit existing User
$userTable = Doctrine::getTable('User');
$user = $userTable->findOneByUsername('jwage');
$user->password = 'newpassword';
$user->save();
$ php index.php
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Working with Objects
lamp_doctrine/tools/sandbox/index.php
Adding Phonenumbers
$userTable = Doctrine::getTable('User');
$user = $userTable->findOneByUsername('fabpot');
$user->Phonenumbers[]->phonenumber = '1233451234';
$user->Phonenumbers[]->phonenumber = '9875674543';
$user->save();
$ php index.php
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Working with Objects
lamp_doctrine/tools/sandbox/index.php
Deleting Objects
$userTable = Doctrine::getTable('User');
$user = $userTable->findOneByUsername('fabpot');
$user->Phonenumbers[0]->delete();
$ php index.php
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Working with Objects
lamp_doctrine/tools/sandbox/index.php
Deleting Collections
$userTable = Doctrine::getTable('User');
$user = $userTable->findOneByUsername('fabpot');
$user->Phonenumbers->delete();
$ php index.php
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Custom Accessors
Enable Auto Accessor Override
lamp_doctrine/tools/sandbox/config.php
// ...
$manager = Doctrine_Manager::getInstance();
$manager->setAttribute('auto_accessor_override', true);
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Custom Accessors
Custom `name` accessor
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Custom Accessors
lamp_doctrine/tools/sandbox/models/User.php
class User extends BaseUser
{
public function getName()
{
return trim($this->first_name.' '.$this->last_name);
}
}
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Custom Accessors
lamp_doctrine/tools/sandbox/index.php
$q = Doctrine::getTable('User')
->createQuery('u')
->andWhere('username = ?', 'jwage');
$user = $q->fetchOne();
echo $user->name; // Jonathan Wage
$ php index.php
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Custom Mutator
MD5 encrypt passwords
class User extends BaseUser
{
// ...
public function setPassword($password)
{
$this->_set('password', md5($password));
}
}
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Accessor/Mutator Syntax
Object property, function, array access
echo $user->name;
echo $user->get('name');
echo $user['name'];
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Database Migrations
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Deploy schema changes
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Maintain production data
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Programmatic interface
for issuing DDL statements
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Versions your database
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Upgrade your database to new versions
Downgrade to previous versions
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Database Migrations
Add new status column to users
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Database Migrations
User:
columns:
# ...
status:
type: enum
values: [Pending, Active, Inactive]
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Database Migrations
Generate migration class
$ php doctrine generate-migrations-diff
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Database Migrations
Generate migration class
class Version1 extends Doctrine_Migration_Base
{
public function up()
{
$this->addColumn('user', 'status', 'enum',
'', array('values' => array(0 => 'Pending', 1 =>
'Active', 2 => 'Inactive')));
}
public function down()
{
$this->removeColumn('user', 'status');
}
}
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Database Migrations
Customize migration class
class Version1 extends Doctrine_Migration_Base
{
public function postUp()
{
Doctrine::loadModels(realpath(dirname(__FILE__).'/../models'));
Doctrine::getTable('User')
->createQuery('u')
->update()
->set('status', '?', 'Active')
->execute();
}
// ...
}
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Database Migrations
Executing migration
$ php doctrine migrate
migrate - migrated successfully to version #1
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Database Migrations
Update models from YAML
$ php doctrine generate-models-yaml
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Database Migrations
Inspect migration was
successful or not
New status column exists
Default `Active` value
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Future of Doctrine?
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
New Versions
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Doctrine 1.2
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Continued evolution
of the 1.x codebase
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Doctrine 2.0
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Almost complete re-rewrite
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Major version
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Requires PHP 5.3
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Performance increases from 5.3
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Test suite runs
20% faster
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
And uses 30%
less memory
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Hydration performance
improvements
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Hydration Performance
Doctrine 1.1
4.3435637950897 for 5000 records
Doctrine 2.0
1.4314442552312 for 5000 records
Doctrine 2.0
3.4690098762512 for 10000 records
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Removed Major Limitation
No need to extend a base class
/**
class User extends Doctrine_Record * @DoctrineEntity
{ * @DoctrineTable(name=quot;userquot;)
public function setTableDefinition() */
{ class User
$this->hasColumn('id', 'integer', null, array( {
'primary' => true, /**
'auto_increment' => true * @DoctrineId
)); * @DoctrineColumn(type=quot;integerquot;)
* @DoctrineGeneratedValue(strategy=quot;autoquot;)
$this->hasColumn('username', 'string', 255); */
} public $id;
}
/**
* @DoctrineColumn(type=quot;varcharquot;, length=255)
*/
public $username;
}
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
No more crazy cyclic references
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
print_r() your objects
$user = new User();
$user->username = 'jwage';
print_r($user);
User Object
(
[id] =>
[username] => jwage
)
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Positive effects of
removing the base
class all around
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
General
Improvements
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Code de-coupled
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
3 Main Packages
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Common
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
DBAL
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
ORM
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Use Doctrine DBAL
separate from the ORM
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Easier to extend and override
things
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Better support for
multiple databases
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Sequences, schemas
and catalogs
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Simplified connection
information
$config = new DoctrineORMConfiguration();
$eventManager = new DoctrineCommonEventManager();
$connectionOptions = array(
'driver' => 'pdo_sqlite',
'path' => 'database.sqlite'
);
$em = DoctrineORMEntityManager::create($connectionOptions, $config, $eventManager);
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
No more DSN nightmares
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Connection information
specified as arrays
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Removed old
attribute system
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Replaced with simpler
string based system
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Real Native SQL support
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Driver Based
Meta Data
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
PHP Annotations
/**
* @DoctrineEntity
* @DoctrineTable(name=quot;userquot;)
*/
class User
{
/**
* @DoctrineId
* @DoctrineColumn(type=quot;integerquot;)
* @DoctrineGeneratedValue(strategy=quot;autoquot;)
*/
public $id;
/**
* @DoctrineColumn(type=quot;varcharquot;, length=255)
*/
public $username;
}
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
PHP Code
class User
{
public
$id,
$username;
}
$metadata = new ClassMetadata('User');
$metadata->mapField(array(
'fieldName' => 'id',
'type' => 'integer',
'id' => true
));
$metadata->setIdGeneratorType('auto');
$metadata->mapField(array(
'fieldName' => 'username',
'type' => 'varchar',
'length' => 255
));
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
YAML
class User
{
public
$id,
$username;
}
User:
properties:
id:
id: true
type: integer
idGenerator: auto
username:
type: varchar
length: 255
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Write your own driver
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Cache
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Query Cache
Cache final SQL that is parsed from DQL
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Metadata Cache
Cache the parsing of meta data
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Result Cache
Cache the results of your queries
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Inheritance
Mapping
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Single Table
One table per hierarchy
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Class Table
One table per class
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Concrete Table
One table per concrete class
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Testing
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Switched to phpUnit
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Better mock testing
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Easy to run tests against multiple
DBMS
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Code de-coupled so
it is easier to test
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
New Features
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
New DQL Parser
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Hand written
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Recursive-descent
parser
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Constructs AST
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
PHP Class names
directly represent
DQL language
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Every DQL feature
has a class to handle
parsing
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Easy to maintain
Easy to add new features
Easy to use
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Performance?
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Final SQL can be
easily and effectively cached
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Not practical to parse
every time
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Custom
Column Types
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Add your own data types
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Types are OOP classes
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Easy to extend
or add new types
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Extend DQL
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
DQL parser can
be extended
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Add your own
DQL functions
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
When?
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
First release
in September 09`
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
ALPHA
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
BETA
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
RC
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Stable - 2010’ ?
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
What is next?
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Publishing of first
Doctrine book
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Write more
documentation
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Publish more books
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Doctrine community
extension repository
Symfony has Plugins
and
Doctrine has Extensions
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Default DBAL
and ORM in PEAR2?
De-facto standard?
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
It is up to you! :)
What is Doctrine? www.doctrine-project.org www.sensiolabs.com
Nashville LAMP
Questions?
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
What is Doctrine? www.doctrine-project.org www.sensiolabs.com