Insurers' journeys to build a mastery in the IoT usage
Propel Your PHP Applications
1. Propel Your PHP Applications
Hans Lellelid
International PHP Conference
2007-11-06
2. Introduction
• My name is Hans Lellelid
• Developer + manager at Applied Security,
Inc. (near Washington DC).
• I wrote/ported original Propel.
• I currently manage the project with David
Zülke – and an ever-growing team of
developers.
Hans Lellelid: Propel Your PHP Applications 2
3. This Talk
• Overview of Propel
• A typical work cycle
• More in-depth usage
• Advanced features
• Slides available at
http://propel.phpdb.org/presentations/
Hans Lellelid: Propel Your PHP Applications 3
4. Pre-Flight Check
Going over the basics.
Hans Lellelid: Propel Your PHP Applications 4
5. Fact Sheet
• Propel is an ORM tool for PHP5.
– It is also a code (and DDL) generator.
• Based on Apache Torque.
• Includes runtime and generator
frameworks.
• Uses PDO (v1.2 uses Creole)
• Generator uses Phing tasks to create the
PHP and SQL files.
• Installs using PEAR installer.
Hans Lellelid: Propel Your PHP Applications 5
6. ORM Patterns in PHP
• The most common alternative ORM pattern
in PHP is ActiveRecord.
– (Thank you, Ruby on Rails!)
• Propel is not an ActiveRecord
implementation: it is a Row Data Gateway
+ Table Data Gateway implementation.
• Key differences:
– Clean division of labor between table
operation objects and row instances.
– RDG and TDG are inherently simpler, more
transparent, models.
Hans Lellelid: Propel Your PHP Applications 6
7. Motivations & Purpose
• Created because nothing comparable
existed for PHP at the time.
• Designed to facilitate prototyping and RAD
• Basic Philosophy: Database tasks should
feel as simple as they actually are.
• Designed for “enterprise” frameworks.
Hans Lellelid: Propel Your PHP Applications 7
8. Requirements
• PHP 5
– Version 1.3 requires PHP >= 5.2
– SPL, PDO (1.3), XML, XSLT
• Phing
• A supported database. Currently Propel
supports: MySQL, PostgreSQL, MSSQL,
Oracle, SQLite
Hans Lellelid: Propel Your PHP Applications 8
9. Propel will ...
• Generate classes to represent your
database (model) in an OOP way.
– “Object” classes for rows (RDG)
– “Peer” classes for table operations (TDG)
• Build SQL (DDL) to initialize your database.
• Use unit-of-work pattern to wrap nested
inserts in transactions.
• Provide Exception-based error handling.
• Allow you to avoid SQL (if you want).
• Type-cast output and escape input.
Hans Lellelid: Propel Your PHP Applications 9
10. But Propel won't ...
• Build forms, reports, or other display stuff.
– Several full frameworks are built around
Propel to provide this (e.g Symfony, Agavi)
• Help you design your database.
• Prevent you from writing insecure code.
• Replenish essential electrolytes after a hard
workout.
Hans Lellelid: Propel Your PHP Applications 10
11. Flight Plan
A Typical Propel Work Cycle
Hans Lellelid: Propel Your PHP Applications 11
12. A Typical Workflow
• Design Database in XML (schema.xml)
• Configure generator (build.properties)
• Configure runtime (runtime-conf.xml)
• Build SQL DDL and PHP classes.
• (Maybe) initialize database.
• Use newly-built objects in your application.
Hans Lellelid: Propel Your PHP Applications 12
13. schema.xml
• The schema.xml is the single authority for
your data model.
• Written in [quite intuitive] XML
<?xml version=quot;1.0quot;?>
<database name=quot;demoquot;>
<table name=quot;sessionquot;>
<column name=quot;idquot; type=quot;integerquot; primaryKey=quot;truequot; />
<column name=quot;namequot; type=quot;varcharquot; size=quot;255quot; />
<column name=quot;roomquot; type=quot;varcharquot; size=quot;16quot; />
<column name=quot;speakerquot; type=quot;varcharquot; size=quot;32quot; />
</table>
</database>
• Will be validated by build process (DTD and
schema provided).
Hans Lellelid: Propel Your PHP Applications 13
14. build.properties
• Generator uses “properties” files (Phing)
• Propel needs to know (at least) your
RDBMS and project name.
• It's often simplest to start with the
provided “bookstore” example.
• Example minimal build.properties:
propel.project = myproj
propel.database = mysql
propel.database.url = mysql:dbname=test
Hans Lellelid: Propel Your PHP Applications 14
15. runtime-conf.xml
• Runtime config expressed in XML.
• Configures connection and (optionally)
PEAR logging facility.
• Gets converted to PHP by build process.
<config>
<propel>
<datasources default=quot;myprojquot;>
<datasource id=quot;myprojquot;>
<adapter>mysql</adapter>
<connection>
<dsn>mysql:dbname=test</dsn>
</connection>
</datasource>
</datasources>
</propel>
</config>
Hans Lellelid: Propel Your PHP Applications 15
16. Build!
• Run propel-gen /path/to/projdir to
build the SQL DDL and PHP classes.
• Watch output for errors. (They're red.)
Hans Lellelid: Propel Your PHP Applications 16
17. Initialize DB
• Use propel-gen /path/to/projdir
insert-sql to run the generated DDL
statements against your configured
database.
• This will delete any existing data!
Hans Lellelid: Propel Your PHP Applications 17
18. Start using new OM
• Initialize Propel
require_once 'propel/Propel.php';
Propel::init('/path/to/myproj-conf.php');
• Configure your include_path to include the
output directory.
– Propel 1.3 uses SPL autoload.
• Begin reading and writing DB rows with
your new object model.
Hans Lellelid: Propel Your PHP Applications 18
19. Cruising Altitude
Getting comfortable with Propel.
Hans Lellelid: Propel Your PHP Applications 19
20. Column Types
• Propel uses an abstract subset of SQL
types.
• SQL types are mapped to specific PHP
types.
• You can override the SQL type for a
column.
• Temporal values (DATE, TIME, TIMESTAMP)
will use PHP DateTime objects.
Hans Lellelid: Propel Your PHP Applications 20
21. Expressing Relationships
• Relationships between tables are defined
using foreign keys.
– Even for systems that don't support true FK
constraints.
• Propel supports single or composite foreign
keys.
• Support for deletion cascading emulation.
• The related objects can be get/set just like
simple column values.
Hans Lellelid: Propel Your PHP Applications 21
22. Selecting Rows
• retrieveByPK() static method exists to
select a single row.
• Criteria provides an OO approach to
building queries.
• Smart handling of column types.
• Multiple “Criterion” objects can be grouped
together to form complex queries.
• You can also use SQL, if you prefer.
Hans Lellelid: Propel Your PHP Applications 22
23. Customization
• Build properties customize code generation.
• Override method and constant naming from
the schema.xml
• Empty stub object & peer classes for
custom methods:
– New methods or
– Override parent (base) methods
Hans Lellelid: Propel Your PHP Applications 23
24. Over-Drive
Wait ... I thought we were using
airplane metaphors.
Hans Lellelid: Propel Your PHP Applications 24
25. Locator Objects (LOBs)
• LOB columns returned as PHP streams.
– This is the PDO design (though there are
some exceptions).
• Mutator methods support streams or
(string) file contents.
Hans Lellelid: Propel Your PHP Applications 25
26. Inheritance
• Propel supports table-per-class-hierarchy
inheritance.
• Subclasses can be enumerated in the
schema.xml (faster) or resolved at runtime
(more flexible).
• Plans in place for other inheritance models.
Hans Lellelid: Propel Your PHP Applications 26
27. Other Features
• Reverse engineer existing databases
(requires Creole)
• Import and export data as XML
• Generate Graphviz ERD from schema.xml
• Represent trees in SQL using nested set
approach.
Hans Lellelid: Propel Your PHP Applications 27
28. Extension Paths
• Integrating with other Phing projects
• Custom platform classes
– Affects generation of SQL DDL
• Custom builder classes
– Determine how your classes are built.
Hans Lellelid: Propel Your PHP Applications 28
29. The 2.0 Horizon
• Criteria redesign
• New inheritance models
• Eagerly awaiting PHP6 (or 5.3)
– Namespaces
– Late static binding
• Plugin-based builder framework.
Hans Lellelid: Propel Your PHP Applications 29
30. On Behalf of the Flight
Crew ...
Thanks for listening. :)
Hans Lellelid: Propel Your PHP Applications 30