Zend Framework Tutorial
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Zend Framework Tutorial

  • 12,700 views
Uploaded on

Introduction to Zend Framework, covering birds-eye overview of the project, how to download and install it, basic building blocks (autoloading, plugins, and configuration), and creating a sample......

Introduction to Zend Framework, covering birds-eye overview of the project, how to download and install it, basic building blocks (autoloading, plugins, and configuration), and creating a sample Pastebin application do demonstrate aspects of the ZF MVC layer.

Building the sample application is approximately the final 2 hours of the presentation, and is done as a hands-on tutorial. The sample application will be uploaded elsewhere for review.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
12,700
On Slideshare
12,644
From Embeds
56
Number of Embeds
5

Actions

Shares
Downloads
436
Comments
0
Likes
9

Embeds 56

http://www.slideshare.net 43
http://zend-me.overblog.com 5
http://coderwall.com 4
http://www.mefeedia.com 3
http://www.linkedin.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide
  • Note that it actually calls “dispatch()” on the action controller, which then attempts to call the appropriate action method.

Transcript

  • 1. Zend Framework Tutorial Matthew Weier O'Phinney Project Lead Zend Framework CodeWorks 2009 28 Sep – 4 Oct 2009 ATL, Miami, DC, NYC
  • 2. About me:
    • ZF Contributor since January 2006
    • 3. Assigned to the ZF team in July 2007
    • 4. Promoted to Software Architect in April 2008
    • 5. Project Lead since April 2009
    Photo © 2009, Chris Shiflett
  • 6. What we'll cover
  • 7.
    • What is Zend Framework?
    • 8. Getting and Installing Zend Framework
    • 9. Utilities and Patterns used throughout ZF
    • 10. Using ZF's MVC layer: Hands-on demonstration: Pastebin
  • 11. What is Zend Framework?
  • 12. Full Stack Framework?
  • 13. Component Library?
  • 14. Both.
  • 15.  
  • 16. Getting and Installing Zend Framework
  • 17. Always found at: http://framework.zend.com /download/latest
  • 18. CDN Links are at top
  • 19. Direct Links are below
  • 20.
    • Use CLI: % tar xzf ZendFramework-1.9.2-minimal.tar.gz % unzip ZendFramework-1.9.2-minimal.zip
    • 21. Or use a GUI file manager
    Unzip/Untar
  • 22. Add to your include_path ; UNIX: "/path1:/path2" include_path = ".:/home/matthew/zf/library"
  • 23. Add to your include_path # Goes in either a <VirtualHost>, # <Directory> or .htaccess: php_value include_path &quot;.:/home/matthew/zf/library&quot;
  • 24. Add to your include_path <?php set_include_path( implode (PATH_SEPARATOR, array ( '.' , '/home/matthew/zf/library' , get_include_path(), )));
  • 25. Utilities and Patterns Used throughout Zend Framework
  • 26. The Autoloader
  • 27.
    • Class names have a 1:1 relationship with the FileSystem: Zend_Db => Zend/Db.php
    • 28. The initial class prefix is called the “vendor” or “namespace” prefix: “Zend_”, “ZendX_”
    • 29. Register either namespace prefixes or actual autoloader callbacks with the ZF autoloader
    Rules
  • 30. Initialize the autoloader require_once 'Zend/Loader/Autoloader.php' ; Zend_Loader_Autoloader::getInstance();
  • 31. Register namespaces $al = Zend_Loader_Autoloader::getInstance(); $al ->registerNamespace( 'Foo_' ); $al ->registerNamespace( array ( 'Foo_' , 'Bar_' ));
  • 32. Register other autoloaders $al = Zend_Loader_Autoloader::getInstance(); $al ->registerNamespace( 'Doctrine' ); $al ->pushAutoloader( array ( 'Doctrine' , 'autoload' ), 'Doctrine_' );
  • 33.
    • Groups of resources with a common vendor prefix/namespace
    • 34. No 1:1 mapping between class name and filename
    • 35. Define arbitrary mappings, or use Zend_Application_Module_Autoloader for use with MVC modules
    Resource Autoloaders
  • 36. Create a resource autoloader // Initialize resource autoloader: $loader = new Zend_Loader_Autoloader_Resource( array ( 'namespace' => 'Foo' , 'basePath' => $path , )); // Map $path/forms/*.php to Foo_Form_*: $loader ->addResourceType( 'form' , 'forms' , 'Form' );
  • 37. Create a module autoloader /* * Maps: * - forms/ -> Foo_Form_* * - models/ -> Foo_Model_* * - models/DbTable -> Foo_Model_DbTable_* * - plugins -> Foo_Plugin_* * - services -> Foo_Service_* * - views/helpers -> Foo_View_Helper_* * - views/filters -> Foo_View_Filter_* */ $loader = new Zend_Application_Module_Autoloader( array ( 'namespace' => 'Foo' , 'basePath' => dirname (__FILE__), ));
  • 38. Plugins
  • 39.
    • For those times when 1:1 doesn't work (e.g., application code)
    • 40. Standard pattern: “all code in this location shares the same class prefix” (aka PrefixPath)
    • 41. Plugin loader is passed a “short name,” and attempts to resolve it to a known PrefixPath
    Rules
  • 42. Example $element ->addPrefixPath( 'Foo_Validate' , // PREFIX 'foo/plugins/validators/' , // PATH 'validate' ); foo/ |-- plugins/ | |-- validators/ | | |-- Even.php | | |-- Dozens.php | | |-- Int.php
  • 43. Invoking plugins $element ->addValidator( 'NotEmpty' ) ->addValidator( 'Int' ) ->addValidator( 'Even' ) ->addValidator( 'Dozens' ); New, custom validators Custom validator overriding existing validator
  • 44. Zend_Config
  • 45.
    • Zend Framework is configurationless, but often your applications are not
    • 46. Many common configuration formats: XML, INI, PHP
    • 47. Access to configuration values should not vary between backends
    • 48. Configuration inheritance is useful
    Why Zend_Config?
  • 49. Sample INI config [production] app.name = &quot;Foo!&quot; db.adapter = &quot;Pdo_Mysql&quot; db.params.username = &quot;foo&quot; db.params.password = &quot;bar&quot; db.params.dbname = &quot;foodb&quot; db.params.host = &quot;127.0.0.1&quot; [testing : production] db.adapter = &quot;Pdo_Sqlite&quot; db.params.dbname = APPLICATION_PATH &quot;/data/test.db&quot;
  • 50. Sample XML config <?xml version = &quot;1.0&quot; ?> <config> <production> <app><name> Foo! </name></app> <db> <adapter> Pdo_Mysql </adapter> <params username = &quot;foo&quot; password = &quot;bar&quot; dbname = &quot;foodb&quot; host = &quot;127.0.0.1&quot; /> </db> </production> <testing extends = &quot;production&quot; > <db> <adapter> Pdo_Sqlite </adapter> <params dbname = &quot;/data/test.db&quot; /> </db> </testing> </config>
  • 51. Sample PHP config $production = include 'production.conf.php' ; $config = array ( 'db' => array ( 'adapter' => 'Pdo_Sqlite' , 'params' => array ( 'dbname' => APP_PATH . '/../data/test.db' , ), ) ); $config = $production + $config ; return $config ;
  • 52. Instantiating a Config object // Load 'testing' section of INI configuration: $config = new Zend_Config_Ini( $fileName , 'testing' ); // Load 'testing' section of XML configuration: $config = new Zend_Config_Xml( $fileName , 'testing' ); // Load 'testing' configuration via PHP array: $config = include 'testing.conf.php' ; $config = new Zend_Config( $config );
  • 53. Using Config objects // Multiple levels: $appName = $config ->app->name; // Using config object as argument $db = Zend_Db::factory( $config ->db);
  • 54. Using Zend Framework's MVC Layer
  • 55.
    • Learn how to create a new ZF MVC project
    • 56. Learn how to use various MVC components:
      • Zend_Application, Zend_Controller_Front, Zend_Controller_Action, Zend_Controller_Router, Zend_Db_Table, Zend_View, Action Helpers, View Helpers, Zend_Form, Zend_Layout, etc.
    • Learn concepts related to separation of concerns
    Goals
  • 57.
    • Create “pastes” with optional expiry; allow listing pastes by username
    • 58. Single table is ideal for demonstrating simple component interactions
    • 59. Ask questions as you have them!
    The Application: Pastebin
  • 60.
    • A Paste consists of:
      • code: content (required)
      • 61. summary: (optional)
      • 62. code_type: content type (required, default to plain text)
      • 63. username: (optional)
      • 64. timestamp: (required; created on commit)
      • 65. expiry: (optional)
      • 66. identifier: (required; a unique hash)
    Pastebin Specification
  • 67.
    • Each paste will have a unique URL
    • 68. Pastes may optionally expire, in which case they won't be displayed
    • 69. Pastes may be listed by username
    Pastebin Specification
  • 70. Step 1: Create the project
  • 71.
    • In bin/zf.sh or bin/zf.bat of your ZF install (choose based on your OS)
    • 72. Place bin/ in your path, or create an alias on your path: alias zf=/path/to/bin/zf.sh
    • 73. Or use pear.zfcampus.org PEAR channel
    Locate the zf utility
  • 74. Create the project # Unix: % zf.sh create project quickstart # DOS/Windows: C:> zf.bat create project quickstart
  • 75. Add ZF to the project # Symlink: % cd library; ln -s path/to/ZendFramework/library/Zend . # Copy: % cd library; cp -r path/to/ZendFramework/library/Zend .
  • 76. Create a vhost <VirtualHost *: 80 > ServerAdmin you@atyour.tld DocumentRoot /abs/path/to/quickstart/public ServerName quickstart <Directory /abs/path/to/quickstart/public > DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost>
  • 77. Add a hosts entry 127.0.0.1 quickstart
  • 78. Fire up your browser!
  • 79. Looking under the hood
  • 80. The directory tree quickstart |-- application | |-- Bootstrap.php | |-- configs | | `-- application.ini | |-- controllers | | |-- ErrorController.php | | ` -- IndexController.php | |-- models | `-- views | |-- helpers | ` -- scripts | |-- error | | `-- error.phtml | ` -- index | `-- index.phtml |-- library |-- public | ` -- index.php `-- tests |-- application | ` -- bootstrap.php |-- library | `-- bootstrap.php ` -- phpunit.xml 14 directories, 10 files
  • 81. The bootstrap <?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { }
  • 82. Configuration [production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 includePaths.library = APPLICATION_PATH &quot;/../library&quot; bootstrap.path = APPLICATION_PATH &quot;/Bootstrap.php&quot; bootstrap.class = &quot;Bootstrap&quot; resources.frontController.controllerDirectory = APPLICATION_PATH &quot;/controllers&quot; [staging : production] [testing : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 [development : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1
  • 83. Index (default) controller <?php class IndexController extends Zend_Controller_Action { public function init() { /* Initialize action controller here */ } public function indexAction() { // action body } }
  • 84. Error controller class ErrorController extends Zend_Controller_Action { public function errorAction() { $errors = $this ->_getParam( 'error_handler' ); switch ( $errors ->type) { case 'EXCEPTION_NO_CONTROLLER': case 'EXCEPTION_NO_ACTION': // 404 error -- controller or action not found $this ->getResponse()->setHttpResponseCode( 404 ); $this ->view->message = 'Page not found' ; break ; default: // application error $this ->getResponse()->setHttpResponseCode( 500 ); $this ->view->message = 'Application error' ; break ; } $this ->view->exception = $errors ->exception; $this ->view->request = $errors ->request; } }
  • 85. Index view (home page) <center> <div id = &quot;welcome&quot; > <h1> Welcome to the Zend Framework! </h1> <h3> This is your project's main page </h3> <!-- and a little bit more markup --> </div> </center>
  • 86. Error view <h1>An error occurred</h1> <h2><?php echo $this ->message ?></h2> <?php if ( 'development' == APPLICATION_ENV): ?> <h3>Exception information:</h3> <p> <b>Message:</b> <?php echo $this ->exception->getMessage() ?> </p> <h3>Stack trace:</h3> <pre> <?php echo $this ->exception->getTraceAsString() ?> </pre> <h3>Request Parameters:</h3> <pre> <?php var_dump ( $this ->request->getParams()) ?> </pre> <?php endif ?>
  • 87. .htaccess file SetEnv APPLICATION_ENV development RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^.*$ index.php [NC,L]
  • 88. index.php (environment) <?php // Define path to application directory defined ( 'APPLICATION_PATH' ) || define ( 'APPLICATION_PATH' , realpath ( dirname (__FILE__) . '/../application' )); // Define application environment defined ( 'APPLICATION_ENV' ) || define ( 'APPLICATION_ENV' , ( getenv ( 'APPLICATION_ENV' ) ? getenv ( 'APPLICATION_ENV' ) : 'production' )); // Ensure library/ is on include_path set_include_path( implode (PATH_SEPARATOR, array ( realpath (APPLICATION_PATH . '/../library' ), get_include_path(), )));
  • 89. index.php (application) /** Zend_Application */ require_once 'Zend/Application.php' ; // Create application, bootstrap, and run $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); $application ->bootstrap() ->run();
  • 90. Step 2: Create the model
  • 91. Step 3: Create a form
  • 92. Step 4: Create a controller
  • 93. Step 5: Create new routes
  • 94. Step 6: Create controller actions
  • 95. Step 7: Create views
  • 96. Step 8: Create a layout
  • 97. Step 9: Update the default view
  • 98. Step 10: Check it out!
  • 99. Further Steps
  • 100.
    • Add Dojo handling for code highlighting
    • 101. Add CSS for forms
    • 102. Add CSS for errors
    • 103. Add some layout specific styling and/or use dojo containers to improve layout
    • 104. Add Navigation elements to provide a menu/breadcrumbs
    • 105. Add caching (pastes may not be updated; cache forever)
    Make it prettier
  • 106. Summary or, “The fat guy sings”
  • 107.
    • What Zend Framework is
    • 108. Some common utilities/patterns used (autoloading, plugins, configuration)
    • 109. How to build a ZF MVC application
    We looked at:
  • 110. Questions? or, “Your turn!”
  • 111. Thank you. http://framework.zend.com/ http://twitter.com/weierophinney http://slideshare.net/weierophinney Feedback? http://joind.in/talk/view/864