<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.log2e.com &#187; Zend</title>
	<atom:link href="http://blog.log2e.com/tag/zend/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.log2e.com</link>
	<description>Tutorials and Code Snippets</description>
	<lastBuildDate>Tue, 25 May 2010 12:47:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Creating a Custom Resource Plugin in Zend Framework 1.8</title>
		<link>http://blog.log2e.com/2009/06/01/creating-a-custom-resource-plugin-in-zend-framework-18/</link>
		<comments>http://blog.log2e.com/2009/06/01/creating-a-custom-resource-plugin-in-zend-framework-18/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 13:05:31 +0000</pubDate>
		<dc:creator>Stefan Schmalhaus</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://blog.log2e.com/?p=245</guid>
		<description><![CDATA[Version 1.8 of the Zend Framework introduced a whole new concept of bootstrapping an application. The core functionality is contained in the Zend_Application component which supports a strictly object-oriented approach to bootstrapping. Although the new concept is fairly straightforward, it does take a little time to get used to it if you are used to the [...]]]></description>
			<content:encoded><![CDATA[<p>Version 1.8 of the Zend Framework introduced a whole new concept of bootstrapping an application. The core functionality is contained in the <code>Zend_Application</code> component which supports a strictly object-oriented approach to bootstrapping. Although the new concept is fairly straightforward, it does take a little time to get used to it if you are used to the bootstrapping process in earlier versions of ZF. </p>
<p>One of the many interesting features of <code>Zend_Application</code> is the ability to push resources into resource plugin classes which can be utilized simply via configuration. In this tutorial we will be looking at creating a custom resource plugin. The plugin is quite simple, it creates a &#8220;value object&#8221; with the name, author and version of the application, and stores it in the Zend registry.<br />
<span id="more-245"></span></p>
<h3>Standard Resource Plugins</h3>
<p>Version 1.8 ships with a set of standard resource plugins that can be found in the <em>library/Zend/Application/Resource</em> folder:</p>
<p><img class="size-full wp-image-252" title="zend_standard_resource_plugins" src="http://blog.log2e.com/wp-content/uploads/2009/05/zend_standard_resource_plugins.gif" alt="Zend Standard Resource Plugins" width="272" height="428" /></p>
<p>It&#8217;s worthwhile to take a look at the source code of these classes. The use of the available resource plugins <a title="Available Resource Plugins" href="http://zendframework.com/manual/en/zend.application.available-resources.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/zendframework.com/manual/en/zend.application.available-resources.html?referer=');">is described in the Reference Guide</a>. The idea behind the resource plugins is to encapsulate common bootstrapping tasks like setting up a default database adapter, configuring the view, etc. </p>
<p>What makes the resource plugins etremely useful is the fact that the Zend Framework automatically initializes the plugins according to the options set in the application&#8217;s configuration file. You only have to make sure that you provide the proper combination of keys in the configuration file. The first key has to be &#8220;resources&#8221;, the second key has to be the name of the resource plugin, and any further keys should reflect the names of the required options. This way you can even add new resources without needing to touch the bootstrap class itself. (We will look at a sample configuration file shortly.)</p>
<h3>The <i>AppInfo</i> Resource Plugin</h3>
<p>The need to display the application name, version number or author name in different places of the UI (including the browser title) is quite common. There are several ways of doing this in ZF, but for the purpose of this tutorial we will be using a resource plugin which makes it easy to re-use this functionality between applications. Our sample <code>Appinfo</code> resource plugin works very similar to the <code>Locale</code> and <code>Translate</code> plugins. It collects information from the configuration file, instantiates an object and stores it in the Zend registry so that the information later can be retrieved from anywhere in the application.</p>
<p>Let&#8217;s take a look at the folder structure and the configuration file first:</p>
<p><img src="http://blog.log2e.com/wp-content/uploads/2009/05/zend_resource_plugin_setup.gif" alt="Zend Resource Plugin Setup" title="zend_resource_plugin_setup" width="240" height="179" class="size-full wp-image-244" /></p>
<p>Please note the different upper and lower case writing (<i>Appinfo</i> vs. <i>AppInfo</i>) which is due to ZF naming conventions. </p>
<p>In order to make this all work we need to provide some settings in the configuration file. Here&#8217;s an excerpt from the <i>application.ini</i> inside the <i>application/configs</i> folder (the project setup follows the default folder structure as it is created by <code>Zend_Tool_Project</code>).</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co2"># Plugin Paths</span></div>
</li>
<li class="li1">
<div class="de1">pluginpaths<span class="sy0">.</span>MyApp_Resource <span class="sy0">=</span> APPLICATION_PATH <span class="st0">&quot;/../library/MyApp/Resource&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Resource Plugins</span></div>
</li>
<li class="li1">
<div class="de1">resources<span class="sy0">.</span>appinfo<span class="sy0">.</span>name <span class="sy0">=</span> My Application</div>
</li>
<li class="li1">
<div class="de1">resources<span class="sy0">.</span>appinfo<span class="sy0">.</span>author <span class="sy0">=</span> Stefan Schmalhaus</div>
</li>
<li class="li1">
<div class="de1">resources<span class="sy0">.</span>appinfo<span class="sy0">.</span>version <span class="sy0">=</span> <span class="nu0">1.0</span><span class="nu0">.0</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># Autoloader Namespaces</span></div>
</li>
<li class="li1">
<div class="de1">autoloadernamespaces<span class="nu0">.0</span> <span class="sy0">=</span> <span class="st0">&quot;MyApp&quot;</span></div>
</li>
</ol>
</div>
<p>As already <a href="http://akrabat.com/2009/03/25/initial-notes-on-zend_application/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/akrabat.com/2009/03/25/initial-notes-on-zend_application/?referer=');">criticized by Rob Allen</a>, we have to use the key &#8220;pluginpaths&#8221; to define the directory where the plugin is stored, but use the key &#8220;resources&#8221; to configure it! (Please refer to the <a href="http://zendframework.com/manual/en/zend.application.core-functionality.html#zend.application.core-functionality.bootstrap-bootstrapabstract" target="_blank" onclick="pageTracker._trackPageview('/outgoing/zendframework.com/manual/en/zend.application.core-functionality.html_zend.application.core-functionality.bootstrap-bootstrapabstract?referer=');">online documentation</a> for more information on these two keys.) I also added the namespace &#8220;MyApp&#8221; to the Zend autoloader for all classes below the <i>MyApp</i> folder.</p>
<h3>The <i>AppInfo</i> Helper Class</h3>
<p>The class <code>MyApp_AppInfo</code> in the <i>library/MyApp</i> folder is a helper class which simply holds the information we want to make available via the Zend registry.</p>
<div class="geshi no php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> MyApp_AppInfo</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;protected <span class="re1">$_name</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;protected <span class="re1">$_author</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;protected <span class="re1">$_version</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re1">$name</span><span class="sy0">,</span> <span class="re1">$author</span><span class="sy0">,</span> <span class="re1">$version</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">setName</span><span class="br0">&#40;</span><span class="re1">$name</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">setAuthor</span><span class="br0">&#40;</span><span class="re1">$author</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">setVersion</span><span class="br0">&#40;</span><span class="re1">$version</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> setName<span class="br0">&#40;</span><span class="re1">$name</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span>_name <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$name</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> getName<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_name<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> setAuthor<span class="br0">&#40;</span><span class="re1">$author</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span>_author <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$author</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> getAuthor<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_author<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> setVersion<span class="br0">&#40;</span><span class="re1">$version</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span>_version <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re1">$version</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> getVersion<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_version<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h3>The Plugin Class</h3>
<p>The actual resource plugin class is <code>MyApp_Resource_Appinfo</code>, and like any other resource plugin class, it extends <code>Zend_Application_Resource_ResourceAbstract</code>. Here&#8217;s the complete code:</p>
<div class="geshi no php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> MyApp_Resource_Appinfo <span class="kw2">extends</span> Zend_Application_Resource_ResourceAbstract</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;const DEFAULT_REGISTRY_KEY <span class="sy0">=</span> <span class="st0">&#39;AppInfo&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;protected <span class="re1">$_appInfo</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> init<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getAppInfo</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> getAppInfo<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span> &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">null</span> <span class="sy0">===</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_appInfo<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$options</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getOptions</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$name</span> <span class="sy0">=</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;name&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;name&#39;</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$author</span> <span class="sy0">=</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;author&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;author&#39;</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$version</span> <span class="sy0">=</span> <span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;version&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;version&#39;</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span>_appInfo <span class="sy0">=</span> <span class="kw2">new</span> MyApp_AppInfo<span class="br0">&#40;</span><span class="re1">$name</span><span class="sy0">,</span> <span class="re1">$author</span><span class="sy0">,</span> <span class="re1">$version</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$key</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;registry_key&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">!</span><span class="kw3">is_numeric</span><span class="br0">&#40;</span><span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;registry_key&#39;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;? <span class="re1">$options</span><span class="br0">&#91;</span><span class="st0">&#39;registry_key&#39;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">:</span> self<span class="sy0">::</span><span class="me2">DEFAULT_REGISTRY_KEY</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Zend_Registry<span class="sy0">::</span><span class="me2">set</span><span class="br0">&#40;</span><span class="re1">$key</span><span class="sy0">,</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_appInfo<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_appInfo<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>When the resource plugin is initialized during bootstrapping, a new <code>MyApp_AppInfo</code> object is created if it doesn&#8217;t exist. This object gets populated with the data from the configuration file. (The inherited method <code>getOptions()</code> provides an array with the options that were defined in the <i>application.ini</i> file.) Finally, the object is stored in the Zend registry. All this is done automatically, we do not need to do anything &#8220;manually&#8221; in the bootstrap class or anywhere else. </p>
<h3>Usage</h3>
<p>Since the <code>MyApp_AppInfo</code> instance is stored in the Zend registry, we can retrieve the information from there. For example, in a controller we can assign the author name to a view variable like this:</p>
<div class="geshi no php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Some_IndexController <span class="kw2">extends</span> Zend_Controller_Action</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> indexAction<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">view</span><span class="sy0">-&gt;</span><span class="me1">author</span> <span class="sy0">=</span> Zend_Registry<span class="sy0">::</span><span class="me2">get</span><span class="br0">&#40;</span><span class="st0">&#39;AppInfo&#39;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getAuthor</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Or if we wanted to display the application&#8217;s name inside the title tag of our web pages we could utilize the resource from within another resource plugin class. In this case a custom view resource plugin is the most appropriate place to do this:</p>
<div class="geshi no php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> MyApp_Resource_View <span class="kw2">extends</span> Zend_Application_Resource_ResourceAbstract</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;protected <span class="re1">$_view</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> init<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getView</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> getView<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">null</span> <span class="sy0">===</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_view<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$options</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getOptions</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getBootstrap</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">bootstrap</span><span class="br0">&#40;</span><span class="st0">&#39;appinfo&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$title</span> <span class="sy0">=</span> Zend_Registry<span class="sy0">::</span><span class="me2">get</span><span class="br0">&#40;</span><span class="st0">&#39;AppInfo&#39;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$view</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_View<span class="br0">&#40;</span><span class="re1">$options</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">doctype</span><span class="br0">&#40;</span><span class="st0">&#39;XHTML1_STRICT&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$view</span><span class="sy0">-&gt;</span><span class="me1">headTitle</span><span class="br0">&#40;</span><span class="re1">$title</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$viewRenderer</span> <span class="sy0">=</span> Zend_Controller_Action_HelperBroker<span class="sy0">::</span><span class="me2">getStaticHelper</span><span class="br0">&#40;</span><span class="st0">&#39;ViewRenderer&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$viewRenderer</span><span class="sy0">-&gt;</span><span class="me1">setView</span><span class="br0">&#40;</span><span class="re1">$view</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span>_view <span class="sy0">=</span> <span class="re1">$view</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_view<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The important thing here is to enforce the initialization of the <i>AppInfo</i> resource: </p>
<p><code>$this->getBootstrap()-&gt;bootstrap('appinfo');</code></p>
<p>Finally, there is a possible pitfall that you should be aware of. Even if your plugins do not read any options from the configuration file, you still have to provide the key in the configuration file, otherwise the plugins won&#8217;t get initialized. For example:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co2"># Resource Plugins</span></div>
</li>
<li class="li1">
<div class="de1">resources<span class="sy0">.</span>appinfo <span class="sy0">=</span> </div>
</li>
<li class="li1">
<div class="de1">resources<span class="sy0">.</span>view <span class="sy0">=</span></div>
</li>
</ol>
</div>
<p>If you want to learn more on resource plugins, I recommend to take a look at the source code of the standard plugins that ship with the Zend framework. I&#8217;m sure you will come up with your own ideas quickly.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.log2e.com/2009/06/01/creating-a-custom-resource-plugin-in-zend-framework-18/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Utilizing the Zend AMF Server Inside a Zend Controller</title>
		<link>http://blog.log2e.com/2008/12/14/utilizing-the-zend-amf-server-inside-a-zend-controller/</link>
		<comments>http://blog.log2e.com/2008/12/14/utilizing-the-zend-amf-server-inside-a-zend-controller/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 00:39:02 +0000</pubDate>
		<dc:creator>Stefan Schmalhaus</dc:creator>
				<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Zend Amf]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://blog.log2e.com/?p=199</guid>
		<description><![CDATA[Many tutorials suggest that you set up the Zend AMF server directly in the bootstrap or index.php file. But what if you want to build a hybrid application with both Flex and HTML interfaces? In this case it&#8217;s better to let the bootstrap file do its usual job of application dispatching, and to make the [...]]]></description>
			<content:encoded><![CDATA[<p>Many tutorials suggest that you set up the Zend AMF server directly in the bootstrap or <em>index.php</em> file. But what if you want to build a hybrid application with both Flex and HTML interfaces? In this case it&#8217;s better to let the bootstrap file do its usual job of application dispatching, and to make the AMF gateway a controller.</p>
<p><span id="more-199"></span></p>
<h3>Introducing the Gateway Controller</h3>
<p>Setting up a Zend AMF server inside a Zend controller is pretty easy:</p>
<div class="geshi no php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> GatewayController <span class="kw2">extends</span> Zend_Controller_Action </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> indexAction<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getHelper</span><span class="br0">&#40;</span><span class="st0">&#39;ViewRenderer&#39;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">setNoRender</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$server</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Amf_Server<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$server</span><span class="sy0">-&gt;</span><span class="me1">addDirectory</span><span class="br0">&#40;</span> <span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw2">__FILE__</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&#39;/../services/&#39;</span> <span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">echo</span><span class="br0">&#40;</span><span class="re1">$server</span><span class="sy0">-&gt;</span><span class="me1">handle</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Since we do not want to output any visible content we disable the view renderer (otherwise the action controller will look for a view script in a subdirectory named after the controller). The endpoint URI of our AMF server gateway is now something like <em>http://www.mydomain.com/gateway/</em>, and doesn&#8217;t interfere with our other controllers. By calling the <code>addDirectory()</code> method we tell the server where to look for the services. We only need to provide a base directory here. If we set up our remote objects in Flex with full namespaces the AMF server is able to resolve the dot syntax into the appropriate path. </p>
<p>For example, the dot syntax in the source attribute of this remote object</p>
<p><code>&lt;mx:RemoteObject id="articlesRO" showBusyCursor="true" source="com.xeladon.cms.ArticlesService" destination="zend"/&gt;</code></p>
<p>will be transformed into the path <code>com/xeladon/cms/ArticlesService</code>. Please note that in this setup there is no need for explicitly propagating each service class to the server with the <code>setClass()</code> method. For more information on the different approaches (<code>addDirectory()</code> vs. <code>setClass()</code>) please refer to Wade Arnold&#8217;s blog post on <a href="http://wadearnold.com/blog/?p=103" target="_blank" onclick="pageTracker._trackPageview('/outgoing/wadearnold.com/blog/?p=103&amp;referer=');">Lazy Loading Classes</a>. </p>
<h3>Organizing Value Objects with Namespaces</h3>
<p>Now let&#8217;s take this one step further. As a long-time AMFPHP user, I have gotten in the habit of organizing my value objects with namespaces. I usually put my VOs in a folder below the service classes:</p>
<p><a href="http://blog.log2e.com/wp-content/uploads/2008/12/zend_amf_controller_setup.gif"><img class="alignnone size-medium wp-image-120" title="Zend Framework Folder Structure" src="http://blog.log2e.com/wp-content/uploads/2008/12/zend_amf_controller_setup.gif" alt="" width="280" height="434" /></a></p>
<p>We can still do this with Zend but we have to make sure that Zend Loader is able to find the VO classes. I suggest adding the path to the include path in the <em>index.php</em> file:</p>
<div class="geshi no php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">&#39;APPLICATION_PATH&#39;</span><span class="sy0">,</span> <span class="kw3">realpath</span><span class="br0">&#40;</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw2">__FILE__</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&#39;/../application/&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">set_include_path</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">get_include_path</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sy0">.</span> PATH_SEPARATOR <span class="sy0">.</span> APPLICATION_PATH <span class="sy0">.</span> <span class="st0">&#39;/../library/&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sy0">.</span> PATH_SEPARATOR <span class="sy0">.</span> APPLICATION_PATH <span class="sy0">.</span> <span class="st0">&#39;/models/&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sy0">.</span> PATH_SEPARATOR <span class="sy0">.</span> APPLICATION_PATH <span class="sy0">.</span> <span class="st0">&#39;/services/com/xeladon/cms/vo/&#39;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span> <span class="st0">&quot;Zend/Loader.php&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">Zend_Loader<span class="sy0">::</span><span class="me2">registerAutoload</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<h3>Adding More Functionality</h3>
<p>Based on the above setup, we can easily add more functionaliy to the bootstrap file without worrying about the AMF server gateway. We would probably want to make use of <code>Zend_Config</code> for configuring the application, and <code>Zend_Db</code> for managing database interactions. By adding a few more lines of code to the bootstrap file, these functions become automatically available to the AMF service classes. </p>
<p>Let&#8217;s assume we set up a database adapter in the bootstrap file. This allows us to write very clean code inside the service classes. The following code is just an example (where <code>ArticleVO</code> is a typical value object, and <code>Articles</code> is supposed to be a Zend model class that extends <code>Zend_Db_Table</code>):</p>
<div class="geshi no php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> ArticlesService</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span> &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> getArticles<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$articles</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$table</span> <span class="sy0">=</span> <span class="kw2">new</span> Articles<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$result</span> <span class="sy0">=</span> <span class="re1">$table</span><span class="sy0">-&gt;</span><span class="me1">fetchAll</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re1">$result</span> <span class="kw1">as</span> <span class="re1">$row</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$article</span> <span class="sy0">=</span> <span class="kw2">new</span> ArticleVO<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$article</span><span class="sy0">-&gt;</span><span class="me1">id</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">id</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$article</span><span class="sy0">-&gt;</span><span class="me1">author</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">author</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$article</span><span class="sy0">-&gt;</span><span class="me1">title</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">title</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$article</span><span class="sy0">-&gt;</span><span class="me1">teaser</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">teaser</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$article</span><span class="sy0">-&gt;</span><span class="me1">body</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">body</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">array_push</span><span class="br0">&#40;</span><span class="re1">$articles</span><span class="sy0">,</span> <span class="re1">$article</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$articles</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h3>Summary</h3>
<p>What do we gain with all this? </p>
<ol>
<li>We keep things organized and can rely on the same structures (packages, folders, namespaces) in both ActionScript and PHP.</li>
<li>We can use other powerful features of the Zend framework for the application&#8217;s server-side logic.</li>
<li>We have the flexibility of adding Flex/Flash and HTML interfaces to the same core application whenever and whereever needed.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.log2e.com/2008/12/14/utilizing-the-zend-amf-server-inside-a-zend-controller/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
		</item>
		<item>
		<title>What&#8217;s in the Zend Framework for the Flash/Flex Developer?</title>
		<link>http://blog.log2e.com/2008/11/26/whats-in-the-zend-framework-for-the-flashflex-developer/</link>
		<comments>http://blog.log2e.com/2008/11/26/whats-in-the-zend-framework-for-the-flashflex-developer/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 17:01:39 +0000</pubDate>
		<dc:creator>Stefan Schmalhaus</dc:creator>
				<category><![CDATA[AMFPHP]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Amf]]></category>
		<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://blog.log2e.com/?p=109</guid>
		<description><![CDATA[The 1.7 release of the Zend Framework includes the new Zend_Amf package which provides a gateway server implementation for AMF remoting.  By the time of writing this article, there are not many resources available yet (a good starting point is here), and the few tutorials mostly guide you through the process of setting up the [...]]]></description>
			<content:encoded><![CDATA[<p>The 1.7 release of the <a title="Zend Framework" href="http://framework.zend.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/framework.zend.com?referer=');">Zend Framework</a> includes the new <a title="Zend_Amf" href="http://framework.zend.com/manual/en/zend.amf.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/framework.zend.com/manual/en/zend.amf.html?referer=');">Zend_Amf</a> package which provides a gateway server implementation for AMF remoting.  By the time of writing this article, there are not many resources available yet (a good starting point is <a title="Zend_Amf Resources" href="http://diamondtearz.org/blog/zend_amf-collection/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/diamondtearz.org/blog/zend_amf-collection/?referer=');">here</a>), and the few tutorials mostly guide you through the process of setting up the bootstrap file and establishing a MySQL database connection by using <code>mysql_connect()</code> directly in the service classes.</p>
<p><span id="more-109"></span></p>
<p>I would like to introduce a Zend AMF server setup that makes use of some of Zend&#8217;s best practices like configuration files, database adapters and models. If you are a Flash/Flex developer coming from an <a title="AMFPHP" href="http://www.amfphp.org" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.amfphp.org?referer=');">AMFPHP</a> background and have never worked with the Zend framework before, you may easily feel overwhelmed by the framework&#8217;s complexity. This article is not meant to present a thourough overview of all Zend features you could possibly utilize in your Flex/Flash development work, but it might motivate you to dive deeper into the framework&#8217;s features.</p>
<h3>The Folder Structure</h3>
<p>First of all, even if I only need the AMF server from the Zend framework I set up my server directories like I would do with any other Zend/PHP application. If you already have some experience with the Zend framework this folder structure probably looks familiar to you:</p>
<p><a href="http://blog.log2e.com/wp-content/uploads/2008/11/zend_amf_setup.gif"><img class="alignnone size-medium wp-image-120" title="Zend Framework Folder Structure" src="http://blog.log2e.com/wp-content/uploads/2008/11/zend_amf_setup.gif" alt="" width="192" height="266" /></a></p>
<p>This is a rudimentary folder structure, of course, because a typical Zend application with an HTML frontend has additional folders for controllers, views, layouts, forms, plugins, helpers, etc. But the basic setup is the same: We have an <em>application</em> and a <em>library</em> folder that are outside the web server&#8217;s root directory (<em>public</em>). The Zend framework packages are inside the <em>library</em> folder, and below the <em>application</em> folder there are a <em>config</em> and a <em>models</em> folder. For the special purpose of the AMF gateway, I added a <em>services</em> folder which is supposed to contain all service class files.</p>
<h3>The Database and the Configuration File</h3>
<p>Let&#8217;s assume we are working on an application that needs to manage user accounts. A very basic table would look like this:</p>
<div class="geshi no sql">
<div class="head">CREATE TABLE users (</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; id int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">AUTO_INCREMENT</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; username varchar<span class="br0">&#40;</span><span class="nu0">32</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">&#39;&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; password varchar<span class="br0">&#40;</span><span class="nu0">32</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">&#39;&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; email varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">&#39;&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; firstname varchar<span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">&#39;&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; lastname varchar<span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">&#39;&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">PRIMARY</span> <span class="kw1">KEY</span> <span class="br0">&#40;</span>id<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>The database credentials are stored in an INI file (<em>app.ini</em>). In this example there are configuration data for both a production system and a development system. Because the development system configuration data are very similar to those for production, the development section inherits from the production section:</p>
<div class="geshi no ini">
<ol>
<li class="li1">
<div class="de1"><span class="re0"><span class="br0">&#91;</span>production<span class="br0">&#93;</span></span></div>
</li>
<li class="li1">
<div class="de1">database.<span class="re1">adapter </span><span class="sy0">=</span><span class="re2"> PDO_MYSQL</span></div>
</li>
<li class="li1">
<div class="de1">database.params.<span class="re1">host </span><span class="sy0">=</span><span class="re2"> localhost</span></div>
</li>
<li class="li1">
<div class="de1">database.params.<span class="re1">dbname </span><span class="sy0">=</span><span class="re2"> prod_dbname</span></div>
</li>
<li class="li1">
<div class="de1">database.params.<span class="re1">username </span><span class="sy0">=</span><span class="re2"> dbusername</span></div>
</li>
<li class="li1">
<div class="de1">database.params.<span class="re1">password </span><span class="sy0">=</span><span class="re2"> dbpassword</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0"><span class="br0">&#91;</span>development : production<span class="br0">&#93;</span></span></div>
</li>
<li class="li1">
<div class="de1">database.params.<span class="re1">dbname </span><span class="sy0">=</span><span class="re2"> dev_dbname</span></div>
</li>
</ol>
</div>
<p>This configuration file also allows you to easily change the database adapter (if needed).</p>
<h3>The Bootstrap File</h3>
<p>Let&#8217;s take a look at the bootstrap file (<em>index.php</em>):</p>
<div class="geshi php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw3">define</span><span class="br0">&#40;</span><span class="st0">&#39;APPLICATION_PATH&#39;</span><span class="sy0">,</span> <span class="kw3">realpath</span><span class="br0">&#40;</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw2">__FILE__</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&#39;/../application/&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">set_include_path</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">get_include_path</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sy0">.</span> PATH_SEPARATOR <span class="sy0">.</span> APPLICATION_PATH <span class="sy0">.</span> <span class="st0">&#39;/../library/&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sy0">.</span> PATH_SEPARATOR <span class="sy0">.</span> APPLICATION_PATH <span class="sy0">.</span> <span class="st0">&#39;/services/&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sy0">.</span> PATH_SEPARATOR <span class="sy0">.</span> APPLICATION_PATH <span class="sy0">.</span> <span class="st0">&#39;/models/&#39;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span> <span class="st0">&#39;Zend/Loader.php&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">Zend_Loader<span class="sy0">::</span><span class="me2">registerAutoload</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$server</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Amf_Server<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$server</span><span class="sy0">-&gt;</span><span class="me1">setClass</span><span class="br0">&#40;</span><span class="st0">&#39;UsersService&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$server</span><span class="sy0">-&gt;</span><span class="me1">setClassMap</span><span class="br0">&#40;</span><span class="st0">&#39;UserVO&#39;</span><span class="sy0">,</span><span class="st0">&#39;User&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$server</span><span class="sy0">-&gt;</span><span class="me1">setProduction</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span><span class="br0">&#40;</span><span class="re1">$server</span><span class="sy0">-&gt;</span><span class="me1">handle</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>This bootstrap file is very similar to the standard bootstrap files you find in other tutorials or in the Zend Reference Guide. It adds some include paths, initializes the Zend autoload feature for classes, and sets up the AMF server.  </p>
<h3>The Service Classes</h3>
<p>Utilizing the <em>Zend_Config</em> and <em>Zend_Db</em> packages, we set up the database connection in a base service class that the actual service classes inherit from. In line 7 in the listing below we provide a default database adapter for all subsequent instances of <em>Zend_Db_Table</em> objects in our application (for more information, please refer to the <a title="Zend_Db" href="http://framework.zend.com/manual/en/zend.db.table.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/framework.zend.com/manual/en/zend.db.table.html?referer=');">Zend_Db chapter</a> in the Reference Guide). This way we keep the logic of creating a database connection in one central place. </p>
<div class="geshi php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> BaseService </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$configuration</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Config_Ini<span class="br0">&#40;</span>APPLICATION_PATH <span class="sy0">.</span> <span class="st0">&#39;/config/app.ini&#39;</span><span class="sy0">,</span> <span class="st0">&#39;development&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$dbAdapter</span> <span class="sy0">=</span> Zend_Db<span class="sy0">::</span><span class="me2">factory</span><span class="br0">&#40;</span><span class="re1">$configuration</span><span class="sy0">-&gt;</span><span class="me1">database</span><span class="br0">&#41;</span><span class="sy0">;</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; Zend_Db_Table_Abstract<span class="sy0">::</span><span class="me2">setDefaultAdapter</span><span class="br0">&#40;</span><span class="re1">$dbAdapter</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The only real service class in our example is <em>UsersService</em> which extends <em>BaseService</em> and invokes the parent class&#8217;s constructor by calling <code>parent::__construct();</code>. For the sake of simplicity it contains only one method (<code>getUsers()</code>):</p>
<div class="geshi php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> UsersService <span class="kw2">extends</span> BaseService</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; parent<span class="sy0">::</span>__construct<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="kw2">function</span> getUsers<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$usersArray</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$table</span> <span class="sy0">=</span> <span class="kw2">new</span> Users<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re1">$result</span> <span class="sy0">=</span> <span class="re1">$table</span><span class="sy0">-&gt;</span><span class="me1">fetchAll</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$result</span> <span class="kw1">as</span> <span class="re1">$row</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span> &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$user</span> <span class="sy0">=</span> <span class="kw2">new</span> User<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$user</span><span class="sy0">-&gt;</span><span class="me1">id</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">id</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$user</span><span class="sy0">-&gt;</span><span class="me1">username</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">username</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$user</span><span class="sy0">-&gt;</span><span class="me1">email</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">email</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$user</span><span class="sy0">-&gt;</span><span class="me1">firstname</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">firstname</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$user</span><span class="sy0">-&gt;</span><span class="me1">lastname</span> <span class="sy0">=</span> <span class="re1">$row</span><span class="sy0">-&gt;</span><span class="me1">lastname</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">array_push</span><span class="br0">&#40;</span><span class="re1">$usersArray</span><span class="sy0">,</span> <span class="re1">$user</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$usersArray</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>You may wonder what the <em>Users</em> class does (line 12 in the above code listing). Here&#8217;s the answer: It&#8217;s a model class.</p>
<h3>The Model Class</h3>
<p>Models are another important concept of the Zend framework. Although the classical MVC pattern doesn&#8217;t apply in the context of the Zend AMF server, I stick to this concept here because it may come in handy sometimes. Imagine an application that is supposed to support both a Flash and an HTML interface. By following the framework&#8217;s MVC guidelines, we are able to build an application engine that uses the same model classes for both the AMF server gateway and the MVC-based HTML frontend.</p>
<p>The class <em>Users</em> is located in the <em>models</em> folder. It extends <em>Zend_Db_Table</em> and holds the name of the corresponding database table:</p>
<div class="geshi php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Users <span class="kw2">extends</span> Zend_Db_Table</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;protected <span class="re1">$_name</span> <span class="sy0">=</span> <span class="st0">&#39;users&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Remember that we provided an application-wide database adapter for all <em>Zend_Db_Table</em> objects (see line 7 in the <em>BaseService</em> class). By creating an instance of <em>Users</em> (which inherits all methods from <em>Zend_Db_Table</em>) we are able to use <code>fetchAll()</code> to retrieve all rows from the table <em>users</em>.</p>
<h3>The Value Object Class</h3>
<p>The class <em>User</em> (see line 17 in the <em>UsersService</em> code listing) is a helper class that allows us to send an array of typed objects to the Flash player. This is especially useful in Flex-based applications where you want to use value objects for data-binding, for example. By the way, the class <em>User</em> doesn&#8217;t look any different than a VO class in an <a title="AMFPHP" href="http://www.amfphp.org" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.amfphp.org?referer=');">AMFPHP</a> context.</p>
<div class="geshi php">
<div class="head">&lt;?php</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw2">class</span> User <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="re1">$id</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="re1">$username</span> <span class="sy0">=</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="re1">$password</span> <span class="sy0">=</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="re1">$firstname</span> <span class="sy0">=</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="re1">$lastnamne</span> <span class="sy0">=</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="re1">$email</span> <span class="sy0">=</span> <span class="st0">&#39;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>By calling <code>$server->setClassMap('UserVO','User');</code> inside the bootstrap file, the <em>User</em> objects are mapped to <em>UserVO</em>. </p>
<p>I skip the Flex/Flash part here because this topic is well covered in other tutorials. But I hope you caught a glimpse of how you can leverage the power of other components inside the Zend framework &#8211; even if you are only interested in the Zend AMF server. There are more scenarios where the Zend framework may come in handy for a Flash/Flex developer (for example, think of generating PDF files on the fly by using <em>Zend_Pdf</em>).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.log2e.com/2008/11/26/whats-in-the-zend-framework-for-the-flashflex-developer/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
	</channel>
</rss>

