AT A GLANCE
Agavi’s Key Features and Approaches
PHP based, it works best for websites and other HTTP-
based stuff, but you can use it to write any app.
requirements for speciﬁc template engines, DBMSes,
ORMs, client side JS libraries etc.
of HTTP request method verbs, output types,
response implementations etc.
• Form Handling is independent of libraries or template engines.
• Theright things are done in the right places, and the
framework prevents common mistakes.
• Exposing Actions of a web application through a SOAP web
service API etc. can be done in minutes.
• Want an RSS feed of your latest products? It’s just a new
output type away.
• Want to return JSON for Ajax features? Have it done when a
JS framework sends the right request headers!
• AnEnvironment is bootstrapped for every box or
developer. Could be “production”, or “dev-joecool” etc.
•A Context represents a way of accessing the application, like
“web”, “soap” or “console”.
• Any conﬁguration can be speciﬁc to one or more
Environment(s) and/or Context(s).
→ no more copying and overwriting of DB conﬁgs!
MODULES, ACTIONS, VIEWS
• An Application has a number of Modules.
• EachModule has Actions with corresponding Views and
Templates, as well as various conﬁguration ﬁles that control
caching, validation and so on.
• Actions, which can also be nested into folders, contain
application logic, make calls to Models, and have one or
more Views (“Error”, “Success”, “Input” etc.)
• Views handle presentation, usually using Templates.
• Every Action execution happens in an isolated Container.
• Every container has it’s own request data, response, ﬁlters etc.
•A normal execution does not affect the “outside world”.
forwarding can be done by returning a new Container
from a View.
• Global Filters or per-Action/Container ﬁlters.
• Wrap the execution, and call the next Filter in the chain - like
an Onion or a Russian Nested Doll.
• Features like Security or Form Handling are implemented
using Filters inside Agavi.
can be redirected internally, response info can be
modiﬁed etc; numerous possibilities.
LAYERS AND LAYOUTS
• A View can leave instructions on Templates to render; these
are called Layers.
• EachLayer has access to the output of the previous Layers,
and can deﬁne Slots - Containers with Actions that are run
before rendering, returning the content.
• Layerand Slot deﬁnitions can be made in a conﬁguration ﬁle;
the result is a Layout.
• All this can be done programmatically, as well.
• Used for matching URLs, SOAP method names.
• Every route can have children.
can control and modify behavior on matching or
when generating URLs.
• Routescan also set Output Types, force continuing of
execution even though they matched, and much more.
• Also very nice for refactoring existing applications.
• Form Population Filter makes form handling a breeze.
• Can pre-populate forms using given values.
• Re-populates a form when an error occurred.
• Highlights erroneous ﬁelds and labels.
• Can insert error messages into the document.
• All without a single line of code in templates.
• Cache the entire execution of a request, or just parts.
• Action-based, so a Slot that runs can be cached, too.
• Output can be cached on a per-layer basis, so that the outer
master template always runs even when cached.
• Alsocaches cookies (with correct lifetime!), HTTP headers
that were set etc.
not only request parameters, but also Files,
Cookies and HTTP Headers.
• Defaultsettings mean you only have access to data you
• Drastically reduces the possibility of programmer errors.
• Validatorscan have dependencies (“only validate email if
checkbox is on”), different severities, handle arrays, normalize
values (e.g. make Unix TS from date value).
• Conﬁguration ﬁles are XML based.
• Leverages the entire XML ecosystem, for instance:
• XML Schema, RELAX NG and Schematron validation
• XSLT for transformations and backward compatibility
• XIncludes for re-use of common settings
• Essential for structured code without workarounds and hacks.
• Bundles the Unicode CLDR database with information about
all locales of this world.
• Functionsfor translating text, formatting and parsing dates,
numbers and currency values, calendar and timezone
operations, locale information (e.g. list of all countries in
Japanese language etc.)
• Partsof the functionality are ports of ICU, IBM’s Java/C library
I’m terribly sorry you had to endure 12 slides
full of bullet points.
TICKETS, FEATURES, ROADMAP
• Every change has a ticket
• Milestones are public
• Impeccable Changelogs and detailed Release Notes
• Standards process for big changes, modeled after Python PEPs
• Onlyone vulnerability in the history of the project; dealt with
properly using MITRE’s CVE list and detailed announcements.
Read http://trac.agavi.org/ticket/1019 if you’re interested.
1.0.2 (January 27, 2010)
CHG: Update timezone database to 2010b (#1219) (David)
CHG: Update ISO Schematron to version 2010-‐01-‐25 (#1217) (David)
FIX: Build system is incompatible with Phing 2.4.0 (#1216) (David)
FIX: Form Population Filter doesn't filter out empty error messages (#1214) (David)
1.0.2 RC4 (January 19, 2010)
ADD: Support for HTML 5 forms (#1213) (David)
ADD: Support for Doctrine 1.2 (#1210) (David)
ADD: Include error type and code when reporting libxml errors (#1202) (David)
CHG: Update timezone database to 2009u (#1207) (David)
CHG: Move error suppression operator for XML validation calls to wrapper methods (#1201) (David)
FIX: ICU Bug 6814 (#1211) (David)
FIX: AgaviTimeZoneDataParser doesn't support "-‐" as a time value (#1208) (David)
FIX: Several method existence checks don't deal with visibility (#1205) (David)
FIX: Configuration parameter whitespace handling is inconsistent (#1203) (David)
FIX: Regression: single Propel init query is lost during initialization (#1194) (David)
FIX: Regression: support for Propel 1.3 is broken (#1195) (David)
1.0.2 RC3 (December 8, 2009)
ADD: Support for Propel 1.4 (#1181) (David)
CHG: Use printf rather than echo in bin/agavi (#1191) (David)
CHG: Update to PHPUnit 3.4.3 (#1184) (David)
CHG: Update timezone database to 2009s (#1188) (David)
CHG: Make HTTP Content-‐Type response header charset detection in AgaviFormPopulationFilter more robust (#1187) (David)
FIX: Validation drops first element in multi-‐dimensional array exports (#1189) (Dominik)
FIX: AgaviToolkit::literalize incorrectly returns null for certain input values (#1190) (David)
FIX: HTML meta tag charset detection in AgaviFormPopulationFilter never matches strings without quotation marks (#1185) (David)
FIX: FormPopulationFilter raises warning with old PCRE versions (#1183) (David)
FIX: AgaviWebResponse throws notice if "http_headers" parameter is not an array (#1186) (David)
FIX: Duplicate error message if agavi console script cannot determine Phing version (#1180) (David)
• All classes, methods and properties are fully documented
• Tutorial manual and FAQs available
• Mailing Lists and IRC Channel for user support
• Commercial support, training and consulting available through
• Support for Microsoft Internet Information Services (IIS) 7
(with rewrites) and ext/sqlsrv
• Support for Windows Azure Platform
• New XSLT Renderer, takes previous content or returned
value from view as the document, then transforms it
• Great for displaying return values from XML HTTP APIs!
• Exception pages support PHP 5.3 exception linking
• Authorization Layer
• Support for HipHop-PHP (already works, but needs tweaking)
• More support for Windows Azure platform (deployment)
• Hopefully: Storage subsystem with uniﬁed interface
• Maybe: Input types for HTTP
• First beta should be out in September