Table of Contents
Zend_Controller
is the heart of Zend Framework's MVC
system. MVC stands for Model-View-Controller
and is a design pattern targeted at separating application logic
from display logic. Zend_Controller_Front
implements a
Front
Controller pattern, in which all requests are
intercepted by the front controller and dispatched to individual
Action Controllers based on the URL requested.
The Zend_Controller
system was built with extensibility
in mind, either by subclassing the existing classes, writing new
classes that implement the various interfaces and abstract classes
that form the foundation of the controller family of classes, or
writing plugins or action helpers to augment or manipulate the
functionality of the system.
If you need more in-depth information, see the following sections. If you just want to get up and running quickly, read on.
The first step is to create your file system layout. The typical layout is as follows:
application/ controllers/ IndexController.php models/ views/ scripts/ index/ index.phtml helpers/ filters/ html/ .htaccess index.php
In your web server, point your document root to the
html
directory of the above file system layout.
Edit the html/.htaccess
file above to read as
follows:
RewriteEngine on RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
The above rules will route any non-resource (images, stylesheets) requests to the front controller. If there are other extensions you wish to exclude from the front controller (PDFs, text files, etc), add their extensions to the switch, or create your own rewrite rules.
Note | |
---|---|
The above rewrite rules are for Apache; for examples of rewrite rules for other web servers, see the router documentation. |
The bootstrap file is the page all requests are routed through
-- html/index.php
in this case. Open up
html/index.php
in the editor of your choice and add
the following:
<?php require_once 'Zend/Controller/Front.php'; Zend_Controller_Front::run('/path/to/app/controllers');
This will instantiate and dispatch the front controller, which will route requests to action controllers.
Before discussing action controllers, you should first
understand how requests are routed in Zend Framework. By
default, the first segment of a URL path maps to a controller,
and the second to an action. For example, given the URL
http://framework.zend.com/roadmap/components
, the
path is /roadmap/components
, which will map to the
controller roadmap
and the action
components
. If no action is provided, the action
index
is assumed, and if no controller is provided,
the controller index
is assumed (following the
Apache convention that maps a DirectoryIndex
automatically).
Zend_Controller
's dispatcher then takes the
controller value and maps it to a class. By default, it
Title-cases the controller name and appends the word
Controller
. Thus, in our example above, the
controller roadmap
is mapped to the class
RoadmapController
.
Similarly, the action value is mapped to a method of the
controller class. By default, the value is lower-cased, and the
word Action
is appended. Thus, in our example
above, the action components
becomes
componentsAction
, and the final method called is
RoadmapController::componentsAction()
.
So, moving on, let's now create a default action controller and
action method. As noted earlier, the default controller and
action called are both index
. Open the file
application/controllers/IndexController.php
, and
enter the following:
<?php /** Zend_Controller_Action */ require_once 'Zend/Controller/Action.php'; class IndexController extends Zend_Controller_Action { public function indexAction() { } }
By default, the ViewRenderer
action helper is enabled. What this means is that by simply
defining an action method and a corresponding view script, you
will immediately get content rendered. By default,
Zend_View
is used as the View layer in the MVC. The
ViewRenderer
does some magic, and uses the
controller name (e.g., index
) and the current
action name (e.g., index
) to determine what
template to pull. By default, templates end in the
.phtml
extension, so this means that, in the above
example, the template index/index.phtml
will be
rendered. Additionally, the ViewRenderer
automatically assumes that the directory views
at
the same level as the controller directory will be the base view
directory, and that the actual view scripts will be in the
views/scripts/
subdirectory. Thus, the template
rendered will be found in
application/views/scripts/index/index.phtml
.
As mentioned in the
previous section, view scripts are found in
application/views/scripts/
; the view script for the
default controller and action is in
application/views/scripts/index/index.phtml
. Create
this file, and type in some HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>My first Zend Framework App</title> </head> <body> <h1>Hello, World!</h1> </body> </html>
By default, the
error handler plugin is registered. This plugin expects
that a controller exists to handle errors. By default, it
assumes an ErrorController
in the default module
with an errorAction
method:
<?php /** Zend_Controller_Action */ require_once 'Zend/Controller/Action.php'; class ErrorController extends Zend_Controller_Action { public function errorAction() { } }
Assuming the already discussed directory layout, this file will
go in application/controllers/ErrorController.php
.
You will also need to create a view script in
application/views/scripts/error/error.phtml
; sample
content might look like:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Error</title> </head> <body> <h1>An error occurred</h1> <p>An error occurred; please try again later.</p> </body> </html>
With your first controller and view under your belt, you can now
fire up your browser and browse to the site. Assuming
example.com
is your domain, any of the following
URLs will get to the page we've just created:
http://example.com/
http://example.com/index
http://example.com/index/index
You're now ready to start creating more controllers and action methods. Congratulations!