Zend Framework 2 for Newbies

Post on 08-Sep-2014

20,011 views 2 download

description

WordPress boasts a "5 minute install," wouldn't it be nice if we could get a ZF2 site up and running in less than 5 minutes? Wouldn't it be nice to be able to start using ZF2 right away without a huge bell curve? In this session we're going to be utilizing the ZF2 Skeleton app to show you how to quickly install and get ZF2 up and running, as well as the basics of the framework so that at the end of the session you can walk out and have your own ZF2 site up and running within minutes.

transcript

Zend Framework 2

mike stowe

for newbies

October 8, 2013

What we’re going to talk about

•  Why a PHP Framework

•  Why Zend Framework 2

•  Installing Zend Framework 2

•  Zend Framework 2 Structure

•  Modifying the Look and Feel of ZF2

•  Setting up Controllers/ Views

•  Basic Tasks in Zend Framework 2

Our goal: Have Zend Framework 2 up and running in less than 5 minutes!

What we’re NOT going to accomplish

You will not leave this presentation being a Zend

Framework 2 expert (unless you already are one). What

you will leave being able to do is quickly install a ZF2

application based on the skeleton application, and make

a basic, one module site. This talk should give you the

fundamentals to help you better understand ZF2, and be

able to continue learning more about the framework and

the many different libraries it encapsulates.

If you aended in the Zend Framework 2 tutorial yesterday, this probably isn’t for you

What we’re NOT going to accomplish

Also, we are focusing on efficiency and getting a running

start into using Zend Framework 2. This means that we

will not be covering ZF2 best practices or the “best” way

to do things.

This presentation is designed to empower you so that you

can start working immediately with Zend Framework 2,

and start digging into it more and more.

Important to know for this presentation

•  You should be familiar with PHP 5.3

•  Basic understanding of Command Line

•  You should have a basic understanding of MVC

•  You should be familiar with Composer and Git

•  You should understand at least basic OOP concepts

Who am I

•  Minnesotan

•  Zend Certified PHP 5.3

•  PHP Developer 10+ years

•  Author, Speaker, Contributor

•  Zend Framework 2 User (woot)

•  Self proclaimed Dinosaur Trainer

•  Developer Advocate at Constant Contact

@mikegstowe @ctct_api http://developer.constantcontact.com

One final announcement

This presentation comes complete with #hashtags… be

sure to tweet at @mikegstowe or @ctct_api with them…

let’s have some fun and confuse the heck out of those not

in this presentation!

#mikesGeingFired #twierSpam #heyItsaCow

Why use a PHP Framework

•  Rapid Application Development

•  Organization and File Structure

•  Standards and Universality

•  Security, Security, Security

•  Large community for trouble shooting

•  Code and standard advancement

9

Rapid Application Development

While frameworks often have a learning curve, they allow

for rapid development of applications through quick

installs, organized file patterns allowing cross-functional

teamwork, and prebuilt libraries and utilities to help you

accomplish tasks that you would otherwise need to code

yourself.

10

Organization and File Structure

Having an organized file structure allows you to quickly

locate the files you need to modify, as well as allow team

members to quickly jump into your application to make

changes, debug code, or perform code reviews.

11

Standards and Universality

Frameworks come with prebuilt standards that should be

adhered to. These standards allow developers to quickly

jump into projects as the main structure of the

application is the same. You may go from coding a

medical application to a social media platform, but the

back-end is still structured the same allowing you to learn

the system more quickly. Universality also makes the

learning curve for new developers shorter, and provides

more job opportunities for developers in general.

12

Security, Security, Security

Frameworks come with prebuilt libraries for managing

some of the most dangerous functions within applications,

including error handling, sessions, authentication,

handling incoming data, data parsing, and more. These

libraries are used and tested by thousands of users,

reducing the likelihood that they contain vulnerabilities a

single developer or small team can easily miss.

More on security at mikestowe.com/slides

13

Large community

Popular frameworks also have large communities that you

can turn to for help if you are unsure of how to utilize a

library, running into unknown bugs, or to collaborate with

in building new libraries to meet your needs. Large

communities also mean more, and up-to-date

documentation.

14

Code and Standard Advancement

By working with a framework you are exposed to the

latest coding standards and technologies, allowing you to

grow as a developer. At the same time, as frameworks are

utilized and pushed to their limits, members are able to

suggest and implement new standards and functions to

meet the needs of the ever changing, and rapidly growing

enterprise community.

Popular Frameworks

•  Zend Framework 2

•  Code Igniter

•  Symfony 2

•  CakePHP

•  Laravel

•  Lithium

•  Yii

I used Code Igniter to make a CakePHP while listening to a Symfony on my radio until my Lithium baery died, causing it to go Yii. Time to do some yoga and reach my Zend.

16

So why use Zend Framework 2

•  Service Oriented Architecture

•  Strong developer community

•  Online training and certification

•  Used by numerous enterprise organizations

•  Heavily tested with regular updates and releases

•  Modular, use what you need, ignore what you don’t

•  Strong use of OOP and Design Patterns for Consistency

•  Security focused with built in libraries and tools

•  Ideal for test-driven development

•  Scalable

Installing Zend Framework 2

For quick, efficient installs of Zend Framework 2 we will be using Git (git-scm.com) and Composer (getcomposer.org). Git will allow us to quickly pull the latest version of the Zend Framework 2 Skeleton app from Github, while Composer will allow us to install the appropriate version of the Zend Framework Core and keep it updated. You will also need a server running PHP 5.3.3 or higher. Mod_rewrite is also recommended.

18

Installing Git on Windows/ Mac

You can quickly install Git on your Windows or Unix (Mac) computer by visiting http://git-scm.com/downloads and selecting the appropriate download for your operating system.

19

Installing Git on Linux

You can quickly install Git using the appropriate command for your Linux box: System Command

Debian/Ubuntu apt-get install git

Fedora yum install git

Gentoo emerge --ask --verbose dev-vcs/git

Arch Linux pacman -S git

FreeBSD cd /usr/ports/devel/git make install

Solaris 11 Express pkg install developer/versioning/git

OpenBSD pkg_add git

20

Installing Composer

You can install Composer by visiting http://getcomposer.org/download/ or running the following Curl Command in your terminal: curl -sS https://getcomposer.org/installer | php

21

Installing ZF2 in Three Simple Steps

mkdir zf2 cd zf2

1. Create directory on your web server and move into it

git init git remote add source https://github.com/zendframework/ZendSkeletonApplication.git

git pull source master

2. Initialize Git, add the Skeleton Repository, and Download

3. Run Composer

php composer.phar install

22

23

Installing ZF2 in Three Easy Steps

24

Done! ZF2 Installed in less than 5 minutes!

#lessthan5 #KayGo #yesssss #set2stun

25

Your website is now ready to publish… oh wait.

Zend Framework 2 Structure

After running the install you will see

the following structure in your

Application’s directory. Config

contains the main config settings for

the application, module contains

your source code, public contains

public items such as CSS, JavaScript,

and images, and vendor will contain

the ZF2 libraries and third party

libraries.

27

Zend Framework 2 Module Structure

Zend Framework 2 uses the

following directory structure,

where Application is the module

where we will be storing our

code. ZF2 allows us to segment

code or sections of the site in

different modules.

28

Modifying Layouts/ Site Template

Site templates, or layouts are

stored in the layout directory,

found in the module/view

directory.

29

Controllers and Views

Each Controller has it’s own

views directory so that views

can be created for each action.

Note you can use the same view

for different actions, but by

default ZF2 will look for a view

matching the action name

unless specifically told

otherwise.

Digging into the Code

Ok, let’s dig into the code and start customizing our Zend Framework 2 project. Before we get started, it’s important to understand that ZF2 makes heavy use of Object Oriented Programming and design patterns. Zend Framework 2 also allows object chaining within the application, enabling you to perform multiple actions within a single call of the object. Ie: $this->action()->action()->action();

31

Digging into the Code

You can learn more about object oriented programming and design patterns from the following resources: •  http://php.net/manual/en/language.oop5.php

•  http://bit.ly/19auowC

•  http://bit.ly/1a5ywLb

•  http://bit.ly/1bRkHDq

•  http://www.phpdesignpatterns.com/

•  http://bit.ly/1fVgt2Q

32

Modifying the Site Template/ Layout (HEAD)

<?php echo $this->doctype(); ?> <html lang="en"> <head> <meta charset="utf-8"> <?php echo $this->headTitle('ZF2 '. $this->translate('Skeleton Application'))->setSeparator(' - ')->setAutoEscape(false); ?> <?php echo $this->headMeta() ->appendName('viewport', 'width=device-width, initial-scale=1.0') ->appendHttpEquiv('X-UA-Compatible', 'IE=edge'); ?> <!-- Le styles --> <?php echo $this->headLink(array('rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/img/favicon.ico')) ->prependStylesheet($this->basePath() . '/css/style.css') ->prependStylesheet($this->basePath() . '/css/bootstrap-theme.min.css') ->prependStylesheet($this->basePath() . '/css/bootstrap.min.css'); ?> <!-- Scripts --> <?php echo $this->headScript() ->prependFile($this->basePath() . '/js/bootstrap.min.js') ->prependFile($this->basePath() . '/js/jquery.min.js'); ?> </head> !

/module/Application/view/layout/layout.phtml

33

In the HEAD section of the layout you will find the following method calls. These methods allow you to control these items outside of the layout itself, making it easy to modify/ prepend/ append, or delete items.

Modifying the Site Template/ Layout (HEAD)

Method Action/ Functionality

$this->doctype() Handles the document type

$this->headTitle() Handles the document title

$this->headMeta() Handles the meta data

$this->headLink() Handles links/ stylesheets (css)

$this->headScript() Handles scripts in header (js)

34

Modifying the Site Template/ Layout (HEAD)

<?php echo $this->doctype(); ?> <html lang="en"> <head> <meta charset="utf-8"> <?php echo $this->headTitle('ZF2 '. $this->translate('Skeleton Application'))->setSeparator(' - ')->setAutoEscape(false); ?> <?php echo $this->headMeta() ->appendName('viewport', 'width=device-width, initial-scale=1.0') ->appendHttpEquiv('X-UA-Compatible', 'IE=edge'); ?> <!-- Le styles --> <?php echo $this->headLink(array('rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/img/favicon.ico')) ->prependStylesheet($this->basePath() . '/css/style.css') ->prependStylesheet($this->basePath() . '/css/bootstrap-theme.min.css') ->prependStylesheet($this->basePath() . '/css/bootstrap.min.css'); ?> <!-- Scripts --> <?php echo $this->headScript() ->prependFile($this->basePath() . '/js/bootstrap.min.js') ->prependFile($this->basePath() . '/js/jquery.min.js'); ?> </head> !

Let’s look at what’s happening in the HEAD section

35

Modifying the Site Template/ Layout (BODY)

<body> <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation"> <div class="container"> <div class="navbar-header"> <a class="navbar-brand" href="<?php echo $this->url('home') ?>"><img src="<?php echo $this->basePath('img/zf2-logo.png') ?>" alt="Zend Framework 2"/>&nbsp;<?php echo $this->translate('Skeleton Application') ?></a> </div> <div class="collapse navbar-collapse"> <ul class="nav navbar-nav"> <li class="active"><a href="<?php echo $this->url('home') ?>"><?php echo $this->translate('Home') ?></a></li> </ul> </div><!--/.nav-collapse --> </div> </nav> <div class="container"> <?php echo $this->content; ?> <hr> <footer> <p>&copy; 2005 - <?php echo date('Y') ?> by Zend Technologies Ltd. <?php echo $this->translate('All rights reserved.') ?></p> </footer> </div> <!-- /container --> <?php echo $this->inlineScript() ?> </body>!

/module/Application/view/layout/layout.phtml

36

In the BODY section of the layout you will find the following method calls. These methods allow you to make a layout that is dynamic and universal, controlling output through the controller and views.

Modifying the Site Template/ Layout (BODY)

Method Action/ Functionality

$this->basePath() The base path for url/ link purposes

$this->url() Gets a url based on route key/ params

$this->translate() Translate text based on language, default EN

$this->content() Handles the view content outputted to user

$this->inlineScript() Handles inline scripts

37

Modifying the Site Template/ Layout (BODY)

Let’s look at what’s happening in the BODY section

<body> <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation"> <div class="container"> <div class="navbar-header"> <a class="navbar-brand" href="<?php echo $this->url('home') ?>"><img src="<?php echo $this->basePath('img/zf2-logo.png') ?>" alt="Zend Framework 2"/>&nbsp;<?php echo $this->translate('Skeleton Application') ?></a> </div> <div class="collapse navbar-collapse"> <ul class="nav navbar-nav"> <li class="active"><a href="<?php echo $this->url('home') ?>"><?php echo $this->translate('Home') ?></a></li> </ul> </div><!--/.nav-collapse --> </div> </nav> <div class="container"> <?php echo $this->content; ?> <hr> <footer> <p>&copy; 2005 - <?php echo date('Y') ?> by Zend Technologies Ltd. <?php echo $this->translate('All rights reserved.') ?></p> </footer> </div> <!-- /container --> <?php echo $this->inlineScript() ?> </body>!

38

Changing the Layout

Yes, I know… this is horrible… #horrible #vintage #90sChick

<?php echo $this->doctype(); ?> <html lang="en"> <head> <meta charset="utf-8"> <?php echo $this->headTitle($this->translate('New Layout')); ?> <!-- Should probably put some CSS in here --> <!-- And maybe some JavaScript too --> </head> <body> <h1><?php echo $this->translate('My Template'); ?></h1> <h4><?php echo $this->translate('This is a horrible template'); ?></h4> <hr /> <marquee><?php echo $this->translate('Marquee!!!'); ?></marquee> <hr /> <?php echo $this->content; ?> <hr /> <?php echo $this->translate('All rights reserved.'); ?> <?php echo $this->inlineScript() ?> </body> </html> !

39

Changing the Layout

40

Changing Translations

#iSpeakBeiber #klingonMyWorld #habloEspaniol #moo

Because we are using the translate method before outputting our text in the layout, we can update the text in the appropriate language .po file using Poedit and it will be reflected in the layout (the .mo file is automatically updated for us). This allows us to use a single layout for multiple languages. You can find the language files in the language directory of your module.

41

Changing Translations

"Report-Msgid-Bugs-To: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-KeywordsList: translate\n" "X-Poedit-Language: English\n" "X-Poedit-Country: UNITED STATES\n" "X-Poedit-Basepath: .\n" "X-Poedit-SearchPath-0: ..\n" #: ../view/layout/layout.phtml:6 #: ../view/layout/layout.phtml:33 msgid "Skeleton Application" msgstr "" #: ../view/layout/layout.phtml:50 msgid "All rights reserved." msgstr ""!

"Report-Msgid-Bugs-To: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-KeywordsList: translate\n" "X-Poedit-Language: English\n" "X-Poedit-Country: UNITED STATES\n" "X-Poedit-Basepath: .\n" "X-Poedit-SearchPath-0: ..\n" #: ../view/layout/layout.phtml:6 #: ../view/layout/layout.phtml:33 msgid "Skeleton Application" msgstr "" #: ../view/layout/layout.phtml:50 msgid "All rights reserved." msgstr "Copy Freely – it sucks"!

42

Changing Translations

Jumping into the MVC

Now that we have modified the layout and know how to update the general look and feel of our website, let’s take a look at the MVC (Model, View, Controller) aspect of Zend Framework 2. We will initially be putting most of our working code in the controller to explain how things work, but keep in mind that Zend Framework 2 is Service Oriented, so it would be best to create a service that we can call in to handle these actions and reduce the amount of code we have in our controllers.

#models #vampies #chickens

44

Looking at the Controller

<?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class IndexController extends AbstractActionController { public function indexAction() { return new ViewModel(); } } !

/module/Application/src/Application/Controller/IndexController.php

45

Looking at the Controller

Because we’re not really doing anything, the controller is pretty empty. However there are some pretty crucial parts: 1.  We’re pulling in the AbstractActionController and ViewModel

classes

2.  The indexAction() method that is called when accessing the site. This method is called because we are routing “/” to the Application module, IndexController, and index/index.phtml view

3.  We are sending a View Model to tell ZF2 how to handle views for this action. The default is the standard ViewModel, but we could also send back JSON, XML, or just return plain text (terminal).

46

Looking at the Controller

<?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/ZendSkeletonApplication for the canonical source repository * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class IndexController extends AbstractActionController { public function indexAction() { return new ViewModel(); } } !

/module/Application/src/Application/Controller/IndexController.php

47

Looking at the Controller

We can also send variables to the view by placing them in an array, and putting that array in the ViewModel. return new ViewModel(array(‘key’=>’value’)); We can also use the setVariable() method, which gives you more freedom in how you set the variables. $view = new ViewModel(); $view->setVariable(‘key’, ‘value’);

48

Looking at the Controller

namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class IndexController extends AbstractActionController { public function indexAction() { $view = new ViewModel(); $view->setVariable('userName', 'guest'); if (isset($_POST['name'])) { $view->setVariable('userName', htmlspecialchars($_POST['name'])); } return $view; } } !

49

Modifying the View

Now if we go to our view (module/Application/view/application/index/index.phtml) and change the code to: We should see $this->userName echo out “guest” assuming that “name” hasn’t been sent to the site via a POST request.

<p>Welcome <?php echo $this->userName; ?> to my website</p>!

Yes I know, my sucky site just got worse…

50

Modifying the View

51

Showing only the View (No layout)

Let’s say we wanted to only display what was in the view, instead of having it wrapped by the layout. For example, if you wanted to return just the HTML in your view script for use by an AJAX call. We can do this by using the $view->setTerminal() method and setting it to true in our controller.

Note, the default for the setTerminal() method is false

52

Showing only the View (No layout)

namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class IndexController extends AbstractActionController { public function indexAction() { $view = new ViewModel(); $view->setTerminal(true); $view->setVariable('userName', 'guest'); if (isset($_POST['name'])) { $view->setVariable('userName', htmlspecialchars($_POST['name'])); } return $view; } } !

53

Showing only the view (No layout)

54

Handling incoming Data in Zend Framework 2

Zend Framework 2 also has several convenient methods for checking/ using incoming POST/GET data. Instead of relying on the $_POST and $_GET SuperGlobals, Zend Framework 2 takes the guessing out of it and also provides mechanisms for increased security (especially with forms).

#randomHashTag

55

Handling incoming Data in Zend Framework 2

To get incoming data sent via GET we can use: $this->getRequest()->getQuery(’name', ’default’); And to get incoming POST data: $this->getRequest()->getPost('name', ’default');

56

Handling incoming Data in Zend Framework 2

namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class IndexController extends AbstractActionController { public function indexAction() { $view = new ViewModel(); $view->setVariable('userName', 'guest'); if (($name = $this->getRequest()->getPost('name', false))) { $view->setVariable('userName', htmlspecialchars($name)); } return $view; } }!

Adding more pages

Now chances are that you want more than one page on your site. We can build new pages quickly and easily within the indexController simply by adding new actions and corresponding view scripts. We can also create new controllers with new views, and we can assign custom urls to these different views by adding routes in our config file.

#wereWritingaBook #TheHobbit #Twilight #Gar"eld

58

Creating a new Action in the indexController

public function indexAction() { $view = new ViewModel(); $view->setTerminal(true); $view->setVariable('userName', 'guest'); if (isset($_POST['name'])) { $view->setVariable('userName', htmlspecialchars($_POST['name'])); } return $view; } public function aboutAction() { return new ViewModel(); } !

59

Creating a new view script file

We then create a new view

script called “about.phtml” in

the appropriate directory (in

this case Application/view/

application/index/

That’s all there is to it! We can

now customize it like we did

the index.phtml file!

60

Creating new controllers & view sets

Creating a new controller and

view set is extremely easy in

Zend Framework 2. First we

create a new file, in this case

called “calendarController.php”

in the src/Application/Controller

directory. We also create a new

directory in the view/application

directory called calendar where

we will store the view scripts for

this controller.

61

The calendarController.php file

<?php namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class CalendarController extends AbstractActionController { public function indexAction() { return new ViewModel(); } } !

62

Updating the invokable controllers list

To help with script

security, ZF2 contains a

list of invokable

controllers in the

module.config.php file.

We will need to update

this.

63

'controllers' => array( 'invokables' => array( 'Application\Controller\Index' => 'Application\Controller\IndexController', 'Application\Controller\Calendar' => 'Application\Controller\CalendarController' ), ),!

Updating the invokable controllers list

By adding the following line the controller can be invoked when called via a route:

64

Creating new routes

Routes are also stored in

the module.config.php file

found in the config

directory. In this file you

can modify existing routes

and add new routes.

65

Adding a literal route

'routes' => array( 'home' => array( 'type' => 'Zend\Mvc\Router\Http\Literal', 'options' => array( 'route' => '/', 'defaults' => array( 'controller' => 'Application\Controller\Index', 'action' => 'index', ), ), ), ),!

66

Adding a literal route

'routes' => array( 'home' => array( 'type' => 'Zend\Mvc\Router\Http\Literal', 'options' => array( 'route' => '/', 'defaults' => array( 'controller' => 'Application\Controller\Index', 'action' => 'index', ), ), ), 'calendar' => array( 'type' => 'Zend\Mvc\Router\Http\Literal', 'options' => array( 'route' => '/calendar', 'defaults' => array( 'controller' => 'Application\Controller\Calendar', 'action' => 'index', ), ), ), ),!

67

Adding a segmented route

'home' => array( 'type' => 'Zend\Mvc\Router\Http\Literal', 'options' => array( 'route' => '/', 'defaults' => array( 'controller' => 'Application\Controller\Index', 'action' => 'index', ), ), ), 'calendar' => array( 'type' => 'Segment', 'options' => array( 'route' => '/[:controller[/:action]]', 'constraints' => array( 'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', ), 'defaults' => array( 'action' => 'index', ), ), ),!

68

Don’t worry…

#endIsNear #heDoesntShutup #homerDrools

Doing more…

By now you should be able to build a fairly simple website using Zend Framework 2. But Zend Framework isn’t just meant for simple sites, but contains the tools and libraries needed to build enterprise solutions. These libraries include tools to build forms, send emails, handle sessions, databases, internationalization, APIs, send SMS/ push notifications, and more. In the next few slides we’ll take a look at some of these tools (as time permits).

70

Forms

Zend Framework 2 has a powerful forms library that includes many different types of form elements, as well as the ability to add filters (sanitizers) and validators. To get started building a form, create a file with the name of your form (ie scheduleRequestForm) in the forms directory (ie: src/Application/Form). This directory does not exist by default so you will need to create it.

71

Forms

Having this separate

directory for your forms

makes it quick and easy to

find and update forms

within your site.

72

The form code

<?php namespace Application\Form; use Zend\Form\Form; class ScheduleRequestForm extends Form { public function __construct($name = null) { // we want to ignore the name passed parent::__construct('scheduleRequest'); $this->setAttribute('method', 'post'); $this->add(array( 'name' => 'firstName', 'attributes' => array( 'type' => 'text', ), 'options' => array( 'label' => 'First Name', ), ));

73

Using in the controller

use Zend\View\Model\ViewModel; use Application\Form\ScheduleRequestForm; class IndexController extends AbstractActionController { public function indexAction() { $view = new ViewModel(); $form = new ScheduleRequestForm(); $request = $this->getRequest(); if ($request->isPost()) { /** Handle data **/ return $this->redirect()->toRoute('success'); } $view->setVariable('form', $form); return $view; }!

#lionKing #simba #mufasa #lilemermaid #squirrel

74

Using in the controller

use Zend\View\Model\ViewModel; use Application\Form\ScheduleRequestForm; class IndexController extends AbstractActionController { public function indexAction() { $view = new ViewModel(); $form = new ScheduleRequestForm(); $request = $this->getRequest(); if ($request->isPost()) { /** Handle data **/ return $this->redirect()->toRoute('success'); } $view->setVariable('form', $form); return $view; }!

75

Echoing in the view

<h3><?php echo $this->translate('Schedule Request'); ?></h3> <?php $form = $this->form; $form->setAttribute('action', $this->url('home', array('action' => 'add'))); $form->prepare(); echo $this->form()->openTag($form); echo $this->formRow($form->get('firstName')); echo $this->formRow($form->get('lastName')); echo $this->formRow($form->get('dateRequested')); echo $this->formSubmit($form->get('submit')); echo $this->form()->closeTag();!

76

Forms

#youWillSubmit #goodForm #rabbitOfDoom

Sessions

Zend makes starting and storing session data extremely easy using the Zend\Session\Container class:

use Zend\Mvc\Controller\AbstractActionController; use Zend\Session\Container; use Zend\View\Model\ViewModel; class CalendarController extends AbstractActionController { public function indexAction() { $session = new Container('session_storage_key'); /** … **/ } } !

78

Handling sessions

use Zend\Mvc\Controller\AbstractActionController; use Zend\Session\Container; use Zend\View\Model\ViewModel; class CalendarController extends AbstractActionController { public function indexAction() { $session = new Container('session_storage_key'); if (!$session->name) { $session->name = 'guest'; } return new ViewModel(array('userName' => $session->name)); } } !

79

Removing sessions

use Zend\Mvc\Controller\AbstractActionController; use Zend\Session\Container; use Zend\View\Model\ViewModel; class CalendarController extends AbstractActionController { public function logoutAction() { $session = new Container('session_storage_key'); $session->getManager()->getStorage()->clear('session_storage_key'); } }!

You can delete all $_SESSION data by using unset($_SESSION) or clear specific session data by calling the Session Manager and clearing the storage as shown here:

Is he done yet?!?

#isThataHorse #windowPain #hoo"ngIt #LifesNotMare

81

Even more power

Zend Framework 2 has a lot of very powerful and useful services built into it that we just do not have the time to talk about. These include the ServiceLocator also referred to as the ServiceManager and the EventManager. As you continue to develop using Zend Framework 2 you will become more and more used to these two powerful tools, how they are used, and more comfortable working with them. But again, the point of this session was to give you the quick (and ugly) way of doing things to expose you to the framework, and allow you to get your site up and running right away.

82

Continuing on…

So now I want to encourage you to go out, take what you’ve learned here, and start playing with Zend Framework 2. Test it out for yourselves, push the framework and your skills to their limits. There is a great online community that is more than willing to help! And if the going gets tough (because there is a learning curve), just remember to…

83

Continuing on…

Or stare at cat pictures on the internet… that works too. In the meantime, here are some helpful resources to learn more about Zend Framework 2.

#postiveThinking

More Resources

Zend Framework 2 – Getting Started Guide: http://framework.zend.com/manual/2.1/en/user-guide/overview.html Zend Framework Reference Guide: http://framework.zend.com/manual/2.1/en/index.html Building a REST API with ZF2: http://www.slideshare.net/mikestowe/building-a-rest-api-with-zend-framework-2

THANK YOU!!!

Please be sure to let me know you think by tweeting me at @CTCT_API or @mikegstowe Also a special thanks to Constant Contact (@ConstantContact) for letting me do this talk and their support of ZendCon and the PHP community.

Slides posted online at hp://www.mikestowe.com/slides