Your SlideShare is downloading. ×
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Zend Framework Tutorial, ZendCon 2009
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Zend Framework Tutorial, ZendCon 2009

7,365

Published on

Published in: Technology
3 Comments
21 Likes
Statistics
Notes
No Downloads
Views
Total Views
7,365
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
468
Comments
3
Likes
21
Embeds 0
No embeds

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

Transcript

  • 1. Zend Framework Tutorial Matthew Weier O'Phinney Project Lead Zend Framework ZendCon 2009 19 October 2009
  • 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. Zend Server
  • 19. CDN Links
  • 20. Direct Links
  • 21.
    • Use CLI: % tar xzf ZendFramework-1.9.2-minimal.tar.gz % unzip ZendFramework-1.9.2-minimal.zip
    • 22. Or use a GUI file manager
    Unzip/Untar
  • 23. Add to your include_path ; UNIX: "/path1:/path2" include_path = ".:/home/matthew/zf/library"
  • 24. Add to your include_path # Goes in either a <VirtualHost>, # <Directory> or .htaccess: php_value include_path &quot;.:/home/matthew/zf/library&quot;
  • 25. Add to your include_path <?php set_include_path( implode (PATH_SEPARATOR, array ( '.' , '/home/matthew/zf/library' , get_include_path(), )));
  • 26. Utilities and Patterns Used throughout Zend Framework
  • 27. The Autoloader
  • 28.
    • Class names have a 1:1 relationship with the FileSystem: Zend_Db => Zend/Db.php
    • 29. The initial class prefix is called the “vendor” or “namespace” prefix: “Zend_”, “ZendX_”
    • 30. Register either namespace prefixes or actual autoloader callbacks with the ZF autoloader
    Rules
  • 31. Initialize the autoloader require_once 'Zend/Loader/Autoloader.php' ; Zend_Loader_Autoloader::getInstance();
  • 32. Register namespaces $al = Zend_Loader_Autoloader::getInstance(); $al ->registerNamespace( 'Foo_' ); $al ->registerNamespace( array ( 'Foo_' , 'Bar_' ));
  • 33. Register other autoloaders $al = Zend_Loader_Autoloader::getInstance(); $al ->registerNamespace( 'Doctrine' ); $al ->pushAutoloader( array ( 'Doctrine' , 'autoload' ), 'Doctrine_' );
  • 34.
    • Groups of resources with a common vendor prefix/namespace
    • 35. No 1:1 mapping between class name and filename
    • 36. Define arbitrary mappings, or use Zend_Application_Module_Autoloader for use with MVC modules
    Resource Autoloaders
  • 37. 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' );
  • 38. 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__), ));
  • 39. Plugins
  • 40.
    • For those times when 1:1 doesn't work (e.g., application code)
    • 41. Standard pattern: “all code in this location shares the same class prefix” (aka PrefixPath)
    • 42. Plugin loader is passed a “short name,” and attempts to resolve it to a known PrefixPath
    Rules
  • 43. Example $element ->addPrefixPath( 'Foo_Validate' , // PREFIX 'foo/plugins/validators/' , // PATH 'validate' ); foo/ |-- plugins/ | |-- validators/ | | |-- Even.php | | |-- Dozens.php | | |-- Int.php
  • 44. Invoking plugins $element ->addValidator( 'NotEmpty' ) ->addValidator( 'Int' ) ->addValidator( 'Even' ) ->addValidator( 'Dozens' ); New, custom validators Custom validator overriding existing validator
  • 45. Zend_Config
  • 46.
    • Zend Framework is configurationless, but often your applications are not
    • 47. Many common configuration formats: XML, INI, PHP
    • 48. Access to configuration values should not vary between backends
    • 49. Configuration inheritance is useful
    Why Zend_Config?
  • 50. 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;
  • 51. 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>
  • 52. 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 ;
  • 53. 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 );
  • 54. Using Config objects // Multiple levels: $appName = $config ->app->name; // Using config object as argument $db = Zend_Db::factory( $config ->db);
  • 55. Using Zend Framework's MVC Layer
  • 56.
    • Learn how to create a new ZF MVC project
    • 57. 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
  • 58.
    • Create “pastes” with optional expiry; allow listing pastes by username
    • 59. Single table is ideal for demonstrating simple component interactions
    • 60. Ask questions as you have them!
    The Application: Pastebin
  • 61.
    • A Paste consists of:
    Pastebin Specification code content (required) summary (optional) code_type content type (required, default to plain text) username (optional) timestamp (required; created on commit) expiry (optional) identifier (required; a unique hash)
  • 62.
    • Each paste will have a unique URL
    • 63. Pastes may optionally expire, in which case they won't be displayed
    • 64. Pastes may be listed by username
    Pastebin Specification
  • 65. Step 1: Create the project
  • 66.
    • In bin/zf.sh or bin/zf.bat of your ZF install (choose based on your OS)
    • 67. Place bin/ in your path, or create an alias on your path: alias zf=/path/to/bin/zf.sh
    • 68. Or use pear.zfcampus.org PEAR channel
    Locate the zf utility
  • 69. Create the project # Unix: % zf.sh create project quickstart # DOS/Windows: C:> zf.bat create project quickstart
  • 70. 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 .
  • 71. 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>
  • 72. Add a hosts entry 127.0.0.1 quickstart
  • 73. Fire up your browser!
  • 74. Looking under the hood
  • 75. 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
  • 76. The bootstrap <?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { }
  • 77. 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
  • 78. Index (default) controller <?php class IndexController extends Zend_Controller_Action { public function init() { /* Initialize action controller here */ } public function indexAction() { // action body } }
  • 79. 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; } }
  • 80. Index view (home page) <div id = &quot;welcome&quot; > <h1> Welcome to the <span id = &quot;zf-name&quot; > Zend Framework! </span> </h1> <h3> This is your project's main page </h3> <!-- and a little bit more markup --> </div>
  • 81. 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 ?>
  • 82. .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]
  • 83. 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(), )));
  • 84. 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();
  • 85. Step 2: Create the model
  • 86. Step 3: Create a form
  • 87. Step 4: Create a controller
  • 88. Step 5: Create new routes
  • 89. Step 6: Create controller actions
  • 90. Step 7: Create views
  • 91. Step 8: Create a layout
  • 92. Step 9: Update the default view
  • 93. Step 10: Check it out!
  • 94. Further Steps
  • 95.
    • Add Dojo handling for code highlighting
    • 96. Add CSS for forms
    • 97. Add CSS for errors
    • 98. Add some layout specific styling and/or use dojo containers to improve layout
    • 99. Add Navigation elements to provide a menu/breadcrumbs
    • 100. Add caching (pastes may not be updated; cache forever)
    Make it prettier
  • 101. Summary or, “The fat guy sings”
  • 102.
    • What Zend Framework is
    • 103. Some common utilities/patterns used (autoloading, plugins, configuration)
    • 104. How to build a ZF MVC application
    We looked at:
  • 105. Questions? or, “Your turn!”
  • 106. Thank you. http://framework.zend.com/ http://twitter.com/weierophinney http://slideshare.net/weierophinney Feedback? http://joind.in/talk/view/878

×