You are previewing Building PHP Applications with Symfony™, CakePHP, and Zend® Framework.
O'Reilly logo
Building PHP Applications with Symfony™, CakePHP, and Zend® Framework

Book Description

The first detailed, unbiased comparison of the three leading PHP frameworks

Web developers have been eager for an impartial comparison of leading PHP frameworks so they can make educated decisions about the most effective tool for their needs. This guide uses Symfony, CakePHP, and Zend Framework to solve key problems, providing source code examples and comparisons for each. It explains the approach and reviews the similarities and differences in the three frameworks, providing reliable information on which to base your decisions.

  • Symfony, CakePHP, and Zend Framework are considered the leading PHP frameworks; developers need an unbiased comparison to choose which one works best for their individual situations

  • This guide uses each framework to solve the same problems, illustrating the solutions with source code examples and working applications

  • Covers wide range of topics, from installation and configuration to most advanced features like AJAX, web services and automated testing.

  • Includes an appendix of new PHP frameworks, including CodeIgniter, Lithium, and Agavi

  • Bestselling PHP author Elizabeth Naramore serves as technical editor

Comparison of PHP Web Frameworks provides the impartial, side-by-side comparison that developers have been looking for.

Table of Contents

  1. Copyright
  2. Credits
  3. ABOUT THE AUTHORS
  4. ACKNOWLEDGMENTS
  5. Introduction
    1. WHO SHOULD READ THIS BOOK?
    2. COMPARATIVE APPROACH
    3. STRUCTURE OF THIS BOOK
      1. Basics
      2. Common Tasks
      3. Advanced Features
      4. Comparison
      5. Appendices
    4. SOURCE CODE
    5. CONVENTIONS
    6. CONTACT US
    7. ERRATA
    8. P2P.WROX.COM
  6. 1. Introducing Symfony, CakePHP, and Zend Framework
    1. 1.1. WHAT ARE WEB APPLICATION FRAMEWORKS AND HOW ARE THEY USED?
      1. 1.1.1. Framework versus Library
      2. 1.1.2. When You Should Use a Framework and When You Should Not
        1. 1.1.2.1. Advantages
        2. 1.1.2.2. Disadvantages
      3. 1.1.3. PHP versus Other Programming Languages
    2. 1.2. OPEN SOURCE PHP WEB FRAMEWORKS
      1. 1.2.1. Comparison of Popular Interest
      2. 1.2.2. The First Look
        1. 1.2.2.1. Symfony
        2. 1.2.2.2. CakePHP
        3. 1.2.2.3. Zend Framework
      3. 1.2.3. Other Frameworks
        1. 1.2.3.1. CodeIgniter
        2. 1.2.3.2. Lithium
        3. 1.2.3.3. Agavi
        4. 1.2.3.4. Kohana
        5. 1.2.3.5. Prado
        6. 1.2.3.6. Yii
        7. 1.2.3.7. Akelos
        8. 1.2.3.8. Seagull
        9. 1.2.3.9. Qcodo
        10. 1.2.3.10. Solar
        11. 1.2.3.11. PHP On Trax
    3. 1.3. DESIGN PATTERNS IN WEB FRAMEWORKS
      1. 1.3.1. What Is a Design Pattern?
      2. 1.3.2. Model-View-Controller as the Main Structural Design Pattern
        1. 1.3.2.1. MVC versus MVP
      3. 1.3.3. Overview of Other Design Patterns
        1. 1.3.3.1. Singleton
        2. 1.3.3.2. Prototype
        3. 1.3.3.3. Decorator
        4. 1.3.3.4. Chain of Responsibility
        5. 1.3.3.5. State
        6. 1.3.3.6. Iterator
  7. 2. Getting Started
    1. 2.1. REQUIREMENTS
    2. 2.2. XAMPP
      1. 2.2.1. XAMPP for Windows
      2. 2.2.2. XAMPP for Linux
      3. 2.2.3. XAMPP for Mac OS
      4. 2.2.4. Apache
        1. 2.2.4.1. Windows Installation
        2. 2.2.4.2. Linux Installation
        3. 2.2.4.3. MacOS Installation
      5. 2.2.5. Database
        1. 2.2.5.1. MySQL
        2. 2.2.5.2. SQLite
        3. 2.2.5.3. phpMyAdmin — Linux
    3. 2.3. PEAR
      1. 2.3.1.
        1. 2.3.1.1. Windows
        2. 2.3.1.2. Linux
        3. 2.3.1.3. Mac OS
      2. 2.3.2. Subversion (SVN)
      3. 2.3.3. Installation Overview
    4. 2.4. INSTALLATION
      1. 2.4.1. Symfony
        1. 2.4.1.1. Sandbox
        2. 2.4.1.2. PEAR
      2. 2.4.2. CakePHP
      3. 2.4.3. Zend Framework
        1. 2.4.3.1. PEAR
        2. 2.4.3.2. Archive
    5. 2.5. CONFIGURATION
      1. 2.5.1. Symfony
      2. 2.5.2. CakePHP
      3. 2.5.3. Zend Framework
    6. 2.6. HELLO WORLD!
      1. 2.6.1. Symfony
      2. 2.6.2. CakePHP
      3. 2.6.3. Zend Framework
    7. 2.7. STRUCTURE
      1. 2.7.1. Symfony
      2. 2.7.2. CakePHP
      3. 2.7.3. Zend Framework
    8. 2.8. IDE SUPPORT
      1. 2.8.1. NetBeans
      2. 2.8.2. Eclipse
      3. 2.8.3. Zend Studio
  8. 3. Working with Databases
    1. 3.1. OBJECT-RELATIONAL MAPPING
      1. 3.1.1. Object-Relational Impedance Mismatch
      2. 3.1.2. Propel
      3. 3.1.3. Doctrine
      4. 3.1.4. CakePHP's ORM
      5. 3.1.5. Zend_Db
      6. 3.1.6. Other ORM Solutions
    2. 3.2. DATABASE CONFIGURATION
      1. 3.2.1. Open Database Connectivity (ODBC)
      2. 3.2.2. SQLite
        1. 3.2.2.1. Propel
        2. 3.2.2.2. Doctrine
        3. 3.2.2.3. CakePHP
        4. 3.2.2.4. Zend_Db
      3. 3.2.3. PostgreSQL
        1. 3.2.3.1. Propel
        2. 3.2.3.2. Doctrine
        3. 3.2.3.3. CakePHP
        4. 3.2.3.4. Zend_Db
      4. 3.2.4. MySQL
        1. 3.2.4.1. Propel
        2. 3.2.4.2. Doctrine
        3. 3.2.4.3. CakePHP
        4. 3.2.4.4. Zend_Db
      5. 3.2.5. Microsoft SQL Server
        1. 3.2.5.1. Propel
        2. 3.2.5.2. Doctrine
        3. 3.2.5.3. CakePHP
        4. 3.2.5.4. Zend_Db
      6. 3.2.6. Oracle
        1. 3.2.6.1. Propel
        2. 3.2.6.2. Doctrine
        3. 3.2.6.3. CakePHP
        4. 3.2.6.4. Zend_Db
      7. 3.2.7. DB2
        1. 3.2.7.1. CakePHP
        2. 3.2.7.2. Zend_DB
    3. 3.3. COMMUNICATION WITH A DATABASE
      1. 3.3.1. Schema
        1. 3.3.1.1. Propel
        2. 3.3.1.2. Doctrine
        3. 3.3.1.3. CakePHP
        4. 3.3.1.4. Zend Framework
      2. 3.3.2. Fixtures
        1. 3.3.2.1. Symfony
        2. 3.3.2.2. CakePHP
        3. 3.3.2.3. Zend Framework
      3. 3.3.3. Command-line Interface
        1. 3.3.3.1. Symfony — Propel
        2. 3.3.3.2. Symfony — Doctrine
        3. 3.3.3.3. CakePHP
        4. 3.3.3.4. Zend Framework
  9. 4. Your First Application in the Three Frameworks
    1. 4.1. DESIGN
      1. 4.1.1. Project Requirements
    2. 4.2. SYMFONY
      1. 4.2.1. Project
      2. 4.2.2. Model
      3. 4.2.3. Controller
        1. 4.2.3.1. Address List
        2. 4.2.3.2. Adding and Editing Entries
        3. 4.2.3.3. Deleting an Address
      4. 4.2.4. View
        1. 4.2.4.1. Editing/Updating Addresses
        2. 4.2.4.2. Deleting Addresses
          1. 4.2.4.2.1. Address List
    3. 4.3. CAKEPHP
      1. 4.3.1. Project
        1. 4.3.1.1. Routing
      2. 4.3.2. Model
        1. 4.3.2.1. Schema
      3. 4.3.3. Controller
        1. 4.3.3.1. List of All Addresses
        2. 4.3.3.2. Adding a New Address
        3. 4.3.3.3. Editing an Address
        4. 4.3.3.4. Deleting a Selected Address
        5. 4.3.3.5. Viewing a Selected Address
      4. 4.3.4. View
        1. 4.3.4.1. Address List
        2. 4.3.4.2. Forms
        3. 4.3.4.3. Editing an Address
        4. 4.3.4.4. Viewing a Selected Address
        5. 4.3.4.5. Deleting an Entry
    4. 4.4. ZEND FRAMEWORK
      1. 4.4.1. Project
        1. 4.4.1.1. Routing
      2. 4.4.2. Model
        1. 4.4.2.1. Model Class
        2. 4.4.2.2. Mapper
        3. 4.4.2.3. Db_Table Model
      3. 4.4.3. Controller
        1. 4.4.3.1. List of All Addresses
        2. 4.4.3.2. Adding a New Address
        3. 4.4.3.3. Editing an Entry
        4. 4.4.3.4. Delete
        5. 4.4.3.5. Forms
      4. 4.4.4. View
        1. 4.4.4.1. List of All Addresses
        2. 4.4.4.2. Adding an Entry Page
        3. 4.4.4.3. Editing an Address Entry
        4. 4.4.4.4. Deleting an Entry
  10. 5. Forms
    1. 5.1. FIELD VALIDATION
      1. 5.1.1. How Does Form Validation Work?
      2. 5.1.2. Symfony
        1. 5.1.2.1. Plug-ins
      3. 5.1.3. CakePHP
      4. 5.1.4. Zend Framework
    2. 5.2. CUSTOMIZING FORMS
      1. 5.2.1. Symfony
        1. 5.2.1.1. Widgets
        2. 5.2.1.2. Plug-ins
          1. 5.2.1.2.1. sfFormExtraPlugin
      2. 5.2.2. CakePHP
        1. 5.2.2.1. Customizing Generated HTML
      3. 5.2.3. Zend Framework
        1. 5.2.3.1. Decorators
    3. 5.3. USING CAPTCHA AS SPAM PROTECTION
      1. 5.3.1. Problem
        1. 5.3.1.1. Why Should I Use Captcha?
        2. 5.3.1.2. Various Implementations of Captcha
        3. 5.3.1.3. Writing Your Own Captcha
      2. 5.3.2. Solution
        1. 5.3.2.1. Symfony
          1. 5.3.2.1.1. sfWidgetFormReCaptcha
        2. 5.3.2.2. CakePHP
          1. 5.3.2.2.1. OpenCaptcha
          2. 5.3.2.2.2. reCaptcha
        3. 5.3.2.3. Zend Framework
  11. 6. Mailing
    1. 6.1. CREATING MAILING APPLICATIONS
      1. 6.1.1. Mailing Approaches and Web Servers
      2. 6.1.2. PHP Configuration
      3. 6.1.3. SMTP Server Configuration
        1. 6.1.3.1. UNIX
        2. 6.1.3.2. Windows
    2. 6.2. SWIFTMAILER
      1. 6.2.1. Symfony
        1. 6.2.1.1. Sending Simple E-mail
        2. 6.2.1.2. Sending HTML E-mail
        3. 6.2.1.3. Adding Attachments
        4. 6.2.1.4. Carbon Copy
        5. 6.2.1.5. Remote SMTP Servers
        6. 6.2.1.6. Secure Connections
        7. 6.2.1.7. All in One
      2. 6.2.2. CakePHP
        1. 6.2.2.1. Sending Simple E-mail
        2. 6.2.2.2. Sending HTML E-mail
        3. 6.2.2.3. Adding Attachments, Carbon Copy, and SMTP Connection
        4. 6.2.2.4. All in One
      3. 6.2.3. Zend Framework
        1. 6.2.3.1. Sending Simple E-mail
        2. 6.2.3.2. Sending HTML E-mail
        3. 6.2.3.3. All in One
    3. 6.3. CAKEPHP'S MAILING COMPONENT
      1. 6.3.1. Sending Simple E-mail
      2. 6.3.2. Sending HTML E-mail
      3. 6.3.3. Adding Attachments
      4. 6.3.4. Carbon Copy
      5. 6.3.5. Remote SMTP Servers
      6. 6.3.6. Secure Connections
      7. 6.3.7. All in One
    4. 6.4. ZEND MAILER
      1. 6.4.1. Sending Simple E-mail
      2. 6.4.2. Sending HTML E-mail
      3. 6.4.3. Adding Attachments
      4. 6.4.4. Carbon Copy
      5. 6.4.5. Remote SMTP Servers
      6. 6.4.6. Secure Connection
      7. 6.4.7. All in One
    5. 6.5. PHPMAILER
      1. 6.5.1. Symfony
      2. 6.5.2. CakePHP
        1. 6.5.2.1. All in One
      3. 6.5.3. Zend Framework
        1. 6.5.3.1. Sending Simple E-mail
        2. 6.5.3.2. Sending HTML E-mail
        3. 6.5.3.3. Adding Attachments
        4. 6.5.3.4. Carbon Copy
        5. 6.5.3.5. Remote SMTP Servers
        6. 6.5.3.6. Secure Connection
        7. 6.5.3.7. All in One
  12. 7. Searching
    1. 7.1. PROBLEM
      1. 7.1.1. Full Text Searching
      2. 7.1.2. Indexing
      3. 7.1.3. Search Query
    2. 7.2. SOLUTIONS
      1. 7.2.1. Sphinx
        1. 7.2.1.1. Installing Sphinx
        2. 7.2.1.2. Symfony
        3. 7.2.1.3. Controller
        4. 7.2.1.4. Displaying Results
        5. 7.2.1.5. Pagination
        6. 7.2.1.6. Testing
        7. 7.2.1.7. CakePHP and Zend Framework
      2. 7.2.2. Lucene
        1. 7.2.2.1. Zend Framework
        2. 7.2.2.2. Creating an Index
        3. 7.2.2.3. Searching
        4. 7.2.2.4. Displaying Results
        5. 7.2.2.5. Pagination
        6. 7.2.2.6. Symfony and CakePHP
      3. 7.2.3. Google Custom Search
        1. 7.2.3.1. Setting up Google Custom Search
        2. 7.2.3.2. CakePHP
        3. 7.2.3.3. Symfony and Zend Framework
  13. 8. Security
    1. 8.1. SETTING SECURE CONNECTIONS
      1. 8.1.1. Problem
      2. 8.1.2. Configuring the Web Server
      3. 8.1.3. Symfony
      4. 8.1.4. CakePHP
      5. 8.1.5. Zend Framework
    2. 8.2. SECURING A PROFILE FORM AGAINST XSS AND INJECTION ATTACKS
      1. 8.2.1. Problem
        1. 8.2.1.1. What Is XSS?
        2. 8.2.1.2. Why SQL Injections Are So Dangerous
        3. 8.2.1.3. How Do Other Injection Attacks Work?
      2. 8.2.2. Solution
        1. 8.2.2.1. Symfony
        2. 8.2.2.2. CakePHP
        3. 8.2.2.3. Zend Framework
    3. 8.3. CSRF
      1. 8.3.1. Problem
        1. 8.3.1.1. What Is CSRF?
      2. 8.3.2. Solution
        1. 8.3.2.1. Symfony
        2. 8.3.2.2. CakePHP
        3. 8.3.2.3. Zend Framework
  14. 9. Templates
    1. 9.1. CREATING A SIMPLE IMAGE GALLERY BY USING HELPERS AND LIGHTBOX
      1. 9.1.1. Presentation Layer Helpers
      2. 9.1.2. Lightbox
      3. 9.1.3. Symfony
        1. 9.1.3.1. sfJQueryLightBoxPlugin
        2. 9.1.3.2. sfLightboxPlugin
        3. 9.1.3.3. sfMediaBrowserPlugin
      4. 9.1.4. CakePHP
      5. 9.1.5. Zend Framework
    2. 9.2. USING TEMPLATE ENGINES WITHIN WEB FRAMEWORKS
      1. 9.2.1. Smarty
        1. 9.2.1.1. Smarty for Zend Framework
        2. 9.2.1.2. Smarty for Symfony and CakePHP
      2. 9.2.2. Dwoo
        1. 9.2.2.1. CakePHP
        2. 9.2.2.2. Dwoo for Symfony and Zend Framework
      3. 9.2.3. Twig
    3. 9.3. OVERVIEW OF OTHER ADD-ON TEMPLATE ENGINES
      1. 9.3.1. Template Blocks
      2. 9.3.2. Open Power Template (OPT)
      3. 9.3.3. TinyButStrong
      4. 9.3.4. Rain TPL
      5. 9.3.5. Savant
  15. 10. AJAX
    1. 10.1. INTRODUCING AJAX
    2. 10.2. AUTOCOMPLETE
      1. 10.2.1. Symfony
      2. 10.2.2. CakePHP
      3. 10.2.3. Zend Framework
    3. 10.3. DYNAMIC POPUP WINDOWS
      1. 10.3.1. Symfony
        1. 10.3.1.1. sfFlashMessagePlugin
        2. 10.3.1.2. Lytebox
      2. 10.3.2. CakePHP
      3. 10.3.3. Zend Framework
    4. 10.4. AJAX USER CHAT
      1. 10.4.1. Symfony
      2. 10.4.2. CakePHP
      3. 10.4.3. Zend Framework
  16. 11. Making Plug-ins
    1. 11.1. SYMFONY
      1. 11.1.1. Plug-in Structure
      2. 11.1.2. Developing the Plug-in
      3. 11.1.3. Testing Your Plug-in
    2. 11.2. CAKEPHP
      1. 11.2.1. Plug-in Structure
      2. 11.2.2. Developing the Plug-in
      3. 11.2.3. Testing Your Plug-in
    3. 11.3. ZEND FRAMEWORK
  17. 12. Web Services
    1. 12.1. RESTFUL NEWS READING
      1. 12.1.1. How Does REST Work?
        1. 12.1.1.1. What is cURL?
      2. 12.1.2. Symfony
        1. 12.1.2.1. Getting a List of News
        2. 12.1.2.2. Adding a News Item
        3. 12.1.2.3. Updating News
        4. 12.1.2.4. Deleting News
      3. 12.1.3. CakePHP
        1. 12.1.3.1. Getting a List of News
        2. 12.1.3.2. Creating New Entries
        3. 12.1.3.3. Updating News
        4. 12.1.3.4. Deleting News
      4. 12.1.4. Zend Framework
        1. 12.1.4.1. Getting a List of News
        2. 12.1.4.2. Create News
        3. 12.1.4.3. Updating News
        4. 12.1.4.4. Deleting News
    2. 12.2. PROVIDING SOAP WEB SERVICES IN E-COMMERCE APPLICATIONS
      1. 12.2.1. Installing the SOAP Extension for PHP
      2. 12.2.2. Testing with soapUI
      3. 12.2.3. What is the Difference Between SOAP and REST?
      4. 12.2.4. Symfony
      5. 12.2.5. CakePHP
      6. 12.2.6. Zend Framework
  18. 13. Back End
    1. 13.1. SYMFONY
      1. 13.1.1. Doctrine admin Modules
      2. 13.1.2. Apostrophe
      3. 13.1.3. Diem
    2. 13.2. CAKEPHP
      1. 13.2.1. Croogo
      2. 13.2.2. Wildflower
    3. 13.3. ZEND FRAMEWORK
      1. 13.3.1. TomatoCMS
      2. 13.3.2. Pimcore
      3. 13.3.3. Digitalus CMS
    4. 13.4. FEATURE SUMMARY
  19. 14. Internationalization
    1. 14.1. INTERNATIONALIZATION DEFINED
    2. 14.2. SYMFONY
      1. 14.2.1. Configuration
      2. 14.2.2. Templates
      3. 14.2.3. Forms
      4. 14.2.4. Using a Database for i18n
      5. 14.2.5. Add-ons
    3. 14.3. CAKEPHP
      1. 14.3.1. Configuration
      2. 14.3.2. Templates
      3. 14.3.3. Forms
      4. 14.3.4. Using a Database for i18n
      5. 14.3.5. Add-ons
    4. 14.4. ZEND FRAMEWORK
      1. 14.4.1. Configuration
        1. 14.4.1.1. Zend_Translate
        2. 14.4.1.2. Zend_Locale
      2. 14.4.2. Translation
      3. 14.4.3. Forms
      4. 14.4.4. Using a Database for i18n
      5. 14.4.5. Add-ons
  20. 15. Testing
    1. 15.1. INTRODUCING TESTING
      1. 15.1.1. How to Begin Testing
      2. 15.1.2. Test Cases, Test Suites, and Test Coverage
        1. 15.1.2.1. Test Case
        2. 15.1.2.2. Test Suite
        3. 15.1.2.3. Test Coverage
      3. 15.1.3. Categories of Tests
        1. 15.1.3.1. Black-box Tests
        2. 15.1.3.2. White-box Tests
        3. 15.1.3.3. Grey-box Tests
        4. 15.1.3.4. Smoke Tests
        5. 15.1.3.5. Performance, Load, and Stress Tests
        6. 15.1.3.6. Regression Tests
      4. 15.1.4. When to Finish Testing
      5. 15.1.5. Bugs Are Your Friends
      6. 15.1.6. Fixtures
      7. 15.1.7. Mocks
      8. 15.1.8. Test-Driven Development
      9. 15.1.9. Test Frameworks
        1. 15.1.9.1. PHPUnit
          1. 15.1.9.1.1. Symfony
        2. 15.1.9.2. SimpleTest
        3. 15.1.9.3. Zend Framework
        4. 15.1.9.4. Lime
    2. 15.2. BLACK-BOX REGISTRATION FORM TESTING USING FUNCTIONAL TESTS
      1. 15.2.1. Problem
      2. 15.2.2. Solution
        1. 15.2.2.1. Symfony
        2. 15.2.2.2. CakePHP
          1. 15.2.2.2.1. Command-line Test Execution
          2. 15.2.2.2.2. Web-based Test Execution
        3. 15.2.2.3. Zend Framework
    3. 15.3. CMS TESTS AUTOMATION USING SELENIUM
      1. 15.3.1. Selenium IDE Installation
      2. 15.3.2. Selenium Remote Control Installation
      3. 15.3.3. Problem
      4. 15.3.4. Solution
        1. 15.3.4.1. Symfony
        2. 15.3.4.2. CakePHP
        3. 15.3.4.3. Zend Framework
    4. 15.4. MAILING UNIT TESTING
      1. 15.4.1. Problem
        1. 15.4.1.1. Symfony
        2. 15.4.1.2. CakePHP
        3. 15.4.1.3. Zend Framework
      2. 15.4.2. Solution
        1. 15.4.2.1. Symfony
        2. 15.4.2.2. CakePHP
        3. 15.4.2.3. Zend Framework
  21. 16. User Management
    1. 16.1. BASIC USER MANAGEMENT
      1. 16.1.1. RBAC versus ACL
      2. 16.1.2. Symfony
        1. 16.1.2.1. Basic Security
        2. 16.1.2.2. Dynamic Access
      3. 16.1.3. CakePHP
        1. 16.1.3.1. Defining ACL Entries
        2. 16.1.3.2. Accessing Resources
        3. 16.1.3.3. Dynamic ACL Creation
      4. 16.1.4. Zend Framework
        1. 16.1.4.1. Authentication
        2. 16.1.4.2. Authorization
    2. 16.2. IDENTIFYING USERS USING LDAP IMPLEMENTATION
      1. 16.2.1. Requirements
      2. 16.2.2. How Does LDAP Work?
      3. 16.2.3. Preparing LDAP
        1. 16.2.3.1. ADAM Installation
        2. 16.2.3.2. OpenLDAP Installation
          1. 16.2.3.2.1. Ubuntu
          2. 16.2.3.2.2. FreeBSD
          3. 16.2.3.2.3. Gentoo
          4. 16.2.3.2.4. Other
      4. 16.2.4. LDAP Configuration
        1. 16.2.4.1. ADAM Configuration
          1. 16.2.4.1.1. Adding New Users
          2. 16.2.4.1.2. Uninstalling ADAM
        2. 16.2.4.2. OpenLDAP Configuration
          1. 16.2.4.2.1. Securing OpenLDAP
          2. 16.2.4.2.2. Adding New Users
          3. 16.2.4.2.3. LDAP Browsers
      5. 16.2.5. Solution
        1. 16.2.5.1. Symfony
          1. 16.2.5.1.1. Active Directory
        2. 16.2.5.2. CakePHP
          1. 16.2.5.2.1. Model
          2. 16.2.5.2.2. Controller
          3. 16.2.5.2.3. View
        3. 16.2.5.3. Zend Framework
          1. 16.2.5.3.1. Adapter
          2. 16.2.5.3.2. Refactoring
          3. 16.2.5.3.3. Active Directory
  22. 17. Performance
    1. 17.1. USING JMETER FOR STRESS, LOAD, AND PERFORMANCE TESTS
    2. 17.2. BENCHMARKING
      1. 17.2.1. Hello World
      2. 17.2.2. Simple CRUD Application
    3. 17.3. DEVELOPMENT SPEED
  23. 18. Summary
    1. 18.1. FEATURES
      1. 18.1.1. Symfony
        1. 18.1.1.1. Advantages
        2. 18.1.1.2. Disadvantages
      2. 18.1.2. CakePHP
        1. 18.1.2.1. Advantages
        2. 18.1.2.2. Disadvantages
      3. 18.1.3. Zend Framework
        1. 18.1.3.1. Advantages
        2. 18.1.3.2. Disadvantages
      4. 18.1.4. Table of Features
    2. 18.2. AND THE WINNER IS...
  24. A. Web Resources
    1. A.1. GENERAL
    2. A.2. SYMFONY
    3. A.3. CAKEPHP
    4. A.4. ZEND FRAMEWORK
    5. A.5. DESIGN PATTERNS
    6. A.6. ORM
    7. A.7. DATABASES
    8. A.8. LDAP
    9. A.9. SEARCHING
    10. A.10. TESTING
    11. A.11. SECURITY
    12. A.12. PDF
    13. A.13. WEB SERVICES
    14. A.14. MAILING
    15. A.15. TEMPLATES
    16. A.16. IDE
    17. A.17. JAVASCRIPT
    18. A.18. AJAX
    19. A.19. CMS
    20. A.20. CODEIGNITER
    21. A.21. LITHIUM
    22. A.22. AGAVI
  25. B. CodeIgniter, Lithium, and Agavi with Code Examples
    1. B.1. CODEIGNITER
      1. B.1.1. Installation
      2. B.1.2. Setting Up the Database
      3. B.1.3. Configuration
      4. B.1.4. Your First Application
      5. B.1.5. Adding Entries
    2. B.2. LITHIUM
      1. B.2.1. Installation
    3. B.3. CLI
      1. B.3.1. Setting Up the Database
      2. B.3.2. Configuration
      3. B.3.3. Your First Application
      4. B.3.4. Adding Entries
      5. B.3.5. Changing Templates
    4. B.4. AGAVI
      1. B.4.1. Installation
      2. B.4.2. Creating the Project
      3. B.4.3. Configuration
      4. B.4.4. First Application
      5. B.4.5. Adding Entries
      6. B.4.6. You Should Be Going on a Date
  26. GLOSSARY OF ACRONYMS AND TECHNICAL TERMS