<?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>Robert Speer Web Development &#187; Zend Framework</title>
	<atom:link href="http://www.robertspeer.com/blog/category/zend-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.robertspeer.com/blog</link>
	<description>Symfony,  PHP, Wordpress, Business Analysis</description>
	<lastBuildDate>Wed, 26 May 2010 14:50:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Symfony refactor of the Zend Quick Start Tutorial</title>
		<link>http://www.robertspeer.com/blog/symfony-refactor-of-the-zend-quick-start-tutorial/</link>
		<comments>http://www.robertspeer.com/blog/symfony-refactor-of-the-zend-quick-start-tutorial/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 20:21:55 +0000</pubDate>
		<dc:creator>robert_speer</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.robertspeer.com/blog/?p=24</guid>
		<description><![CDATA[Learning Zend Framework and getting a repetitive stress injury doing it Edit: please see Matthew Weier O&#8217;Phinney&#8217;s (the current project lead for Zend Framework) response in the comments, there are some exciting things comming for ZF My friends &#38; colleagues have used Zend Framework (ZF) for a while, and I do my best to avoid it [...]]]></description>
			<content:encoded><![CDATA[<p><a style="text-decoration: none;" href="http://digg.com/programming/Symfony_Zend_PHP_Frameworks_compared" target="_DIGG"><br />
<img src="http://digg.com/img/badges/100x20-digg-button.gif" alt="Digg!" width="100" height="20" /></a> <a href="http://www.dzone.com/links/symfony_zend_php_frameworks_compared.html" target="_Dzone"><img src="http://widgets.dzone.com/links/images/std/vwidget3/vwidget_logo.gif" alt="Dzone" /><br />
</a></p>
<h2>Learning Zend Framework and getting a repetitive stress injury doing it</h2>
<p><em>Edit: please see Matthew Weier O&#8217;Phinney&#8217;s (the current project lead for Zend Framework) response in the comments, there are some exciting things comming for ZF</em></p>
<p><span style="font-family: Tahoma; line-height: 16px; color: #584d40;"> </span></p>
<h5 style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; font: normal normal normal 180%/normal Tahoma, Verdana, Arial, Helvetica, sans-serif; color: #362f2c; padding: 0px;"><span style="color: #000000; font-family: Georgia; font-size: 13px; line-height: 19px;">My friends &amp; colleagues have used <a href="http://framework.zend.com/" target="_blank">Zend Framework (ZF)</a> for a while, and I do my best to avoid it and use the <a href="http://www.symfony-project.org/">Symfony PHP framework</a>.  Initially I was open to learning ZF, I was just curious why people liked it.  The more questions I asked, the more I realized there were no good answers other than standards for standards sake, and variations on the <a href="http://en.wikipedia.org/wiki/Sunk_costs#Loss_aversion_and_the_sunk_cost_fallacy">Sunk Cost Fallacy</a>.  If pressed I was told that I had to give <a href="http://framework.zend.com/">Zend Framework</a> a chance because it is a younger framework than <a href="http://www.symfony-project.org/">Symfony</a>, (um no).  Some of the developers had even written a library to add on to<a href="http://framework.zend.com/"> Zend Framework</a> to make it more usable, it contained features that were already in <a href="http://www.symfony-project.org/">Symfony</a>.  IMHO, writing code to help a framework catch up is an excellent reason to switch to another framework.</span></h5>
<p>This last week I was finally forced to use <a href="http://framework.zend.com/">ZF</a>, my rebellious use of <a href="http://www.symfony-project.org/">Symfony</a> only served to annoy the other developers, and had the potential to increase maintenance costs.  It seemed like a reasonable request, and all those developers couldn&#8217;t be wrong could they?<span id="more-24"></span></p>
<p>Well yes they are.  I work with some great people whose feelings I don&#8217;t wish to hurt, but I would estimate that <strong><a href="http://framework.zend.com/">Zend Framework</a></strong><strong> projects cost between 20 to 40 hours more for projects that run around ~400 hour plus. </strong><strong> With agency rates what they are that could turn in to 6 or 7 thousand dollars of added costs. </strong>Assuming requirements for user authentication and backend CRUD&#8217;s.  These numbers will vary widely from project to project.</p>
<p>From a quick comparison of the <a href="http://www.symfony-project.org/blog/category/Case+studies" target="_blank">Symfony Case Studies</a> and the <a href="http://framework.zend.com/about/casestudies" target="_blank">Zend Framework Case studies</a> I would expect this efficiency gap to continue to increase.  A couple of <a href="http://framework.zend.com/">Zend Framework</a>&#8216;s case study subjects have already failed: <a href="http://services.alphaworks.ibm.com/graduated/qedwiki.html">QEDWiki</a> &amp; <a href="http://www.pokerroom.com/community/forum/msg-220313-0#53">PokerRoom.com</a>, and anyone who&#8217;s been unfortunate enough to have to customize <a href="http://www.magentocommerce.com/">Magento</a> likely regrets the experience.   Symfony&#8217;s case studies are large successful projects you may have heard of:  <a href="http://www.symfony-project.org/blog/2009/02/18/dailymotion-powered-by-symfony">DailyMotion</a>, <a href="http://www.symfony-project.org/blog/2008/05/08/yahoo-answers-powered-by-symfony">Yahoo! Answers</a>, <a href="http://www.symfony-project.org/blog/2007/10/02/delicious-preview-built-with-symfony">Delicious</a>, &amp; <a href="http://www.symfony-project.org/blog/2006/10/28/yahoo-bookmarks-uses-symfony">Yahoo! Bookmarks</a>.  To be fair I&#8217;ve seen some really nice <a href="http://framework.zend.com/">Zend Framework</a> apps, I&#8217;ve just seen more interesting and larger <a href="http://www.symfony-project.org/">Symfony</a> projects.</p>
<h2>A Quick Comparison</h2>
<p>To present as fair a comparison as possible I have rewritten the <a href="http://framework.zend.com/docs/quickstart" target="_blank">Zend Framework Quick Start</a> as a <a href="http://www.symfony-project.org/">Symfony</a> app. I also used <a href="http://www.symfony-project.org/">Symfony</a> 1.2 with the Doctrine ORM, both of which I&#8217;ve not used before, as my projects have been in <a href="http://www.symfony-project.org/">Symfony</a> 1 or 1.1 and the Propel ORM so far.</p>
<p>I&#8217;ve formatted this more as a timeline of events rather than a tutorial, however the full <a href="http://www.symfony-project.org/">Symfony</a> app source is available <a href="http://www.robertspeer.com/sfZendQuickStart.zip" target="_self">HERE</a>.  To drop it on your web server you will have to change the path to <a href="http://www.symfony-project.org/">Symfony</a> in config/ProjectConfiguration.class.php, I had it running through <a href="http://www.wampserver.com/en/">WAMP</a> on my local machine.</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">sfZendQuickStart Post</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>9:15am &#8211; 9:30am set up symfony app</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>9:30am -9:38am skip a bunch of Zend configs and translate layout to sf</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>9:40am &#8211; 9:43am generated controller &amp; view, skipping autoloading in the bootstrap file</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>9:43am &#8211; 10:06am set up database</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>wrote schema.yml to define guestbook table</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>setup database connection string:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>php symfony configure:database &#8211;name=doctrine &#8211;class=sfDoctrineDatabase &#8220;mysql:host=localhost;dbname=guestbook&#8221; username password</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span> building model  (10:06am &#8211; 10:20am)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>php symfony doctrine:build-model (GSS)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>php symfony doctrine:build-sql   (generates the sql)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>php symfony doctrine:insert-sql  (putst the sql in the db)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>skipping the build database stuff, symfony does that for us</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>Listing out all guestbook entries in view 10:20am &#8211; 10:35am (got distraced with doctrine, I usually use propel)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>Generating form classes (10:48am)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>configuring to remove created at from view</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>unset( $this['created_at'], $this['updated_at'] );</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>random interruptions by wife&#8230;.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>writing view layer (11 am)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>writing controller for saving  (11:15am)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>Setting up captcha</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>installing form extra plugin:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>php symfony plugin:install sfFormExtraPlugin</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>apparently I can&#8217;t type, kept putting the api keys in wrong , fancy reCaPTCHA complete (11:51am)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>Double checked ZF Quick Start to make sure I did not forget anything</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>done (11:54am),</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span> ~2hrs 39 min</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>with distractions, a mySQL db, and a decent captcha</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span> under 150 lines of me-written code code, including html I C&amp;P&#8217;d from the zend tutorial</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>this means much less fumble finger type mistakes</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>The only config files I touched were</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>config/ProjectConfiguration.class.php to use Doctrine instead of propel automagically</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>config/doctrine/schema.yml to define the db tables</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>config databases.yml was set up from the command line so you be the judge on that one</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>Zend</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>Bootstrap file configuration</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>appliation.ini configuration</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>the zf tutorial expects you to write around 515 lines of code to do the same thing</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 567px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>that&#8217;s from the tutorial text not the well commented source code.</div>
<p>This also serves to document how I wasted a perfectly wonderful summer morning, *sigh*.</p>
<p>I did change some things around, I used MySQL because I&#8217;m not familiar with sqLite and, I used reCaptcha instead of a captcha similar to the tutorials.  I think these add difficulty, and are fair changes.</p>
<ol>
<li><span style="white-space: pre;"> </span>9:15am &#8211; 9:30am set up symfony app</li>
<li>9:30am -9:38am skip a bunch of Zend configs and translating layout to sf</li>
<li>9:40am &#8211; 9:43am generated controller &amp; view, skipping autoloading in the bootstrap file</li>
<li>9:43am &#8211; 10:06am set up database
<ol>
<li>wrote schema.yml to define guestbook table</li>
</ol>
<ol>
<li>setup database connection string:
<ol>
<li>php symfony configure:database &#8211;name=doctrine &#8211;class=sfDoctrineDatabase &#8220;mysql:host=localhost;dbname=guestbook&#8221; username password</li>
</ol>
</li>
</ol>
<ol>
<li>10:06am &#8211; 10:20am building model
<ol>
<li>php symfony doctrine:build-model (Getters, Setters &amp; Stuff or GSS)</li>
<li>php symfony doctrine:build-sql   (generates the sql)</li>
<li>php symfony doctrine:insert-sql  (inserts the sql into the db)</li>
<li>skipping the build database script, symfony does that for us</li>
</ol>
</li>
</ol>
</li>
<li>10:20am &#8211; 10:35am Listing out all guestbook entries in view  (got distracted with <a href="http://www.doctrine-project.org/" target="_blank">doctrine</a>, I usually use <a href="http://propel.phpdb.org/trac/" target="_blank">propel</a>)</li>
<li>10:48 am Generating form classes
<ol>
<li>configuring to remove created at from view
<ol>
<li>unset( $this['created_at'], $this['updated_at'] );</li>
</ol>
</li>
</ol>
</li>
<li>random interruptions by wife&#8230;.</li>
<li>11 am writing view layer</li>
<li>11:15am writing controller for saving</li>
<li>Setting up captcha
<ol>
<li>installing form extra plugin
<ol>
<li>php symfony plugin:install <a href="http://www.symfony-project.org/plugins/sfFormExtraPlugin" target="_blank">sfFormExtraPlugin</a></li>
<li><a href="http://www.symfony-project.org/plugins/sfFormExtraPlugin" target="_blank"></a>I can&#8217;t type, kept putting the api keys in wrong , fancy <a href="http://recaptcha.net/" target="_blank">reCaPTCHA</a> complete (11:51am)</li>
</ol>
</li>
</ol>
</li>
<li>Double checked <a href="http://framework.zend.com/docs/quickstart">ZF Quick Start</a> to make sure I did not forget anything</li>
<li>11:54am done</li>
</ol>
<h3>Development Highlights:</h3>
<h4>Symfony:</h4>
<ul>
<li><strong>under 150 lines of me-written code</strong>, including html I C&amp;P&#8217;d from the zend tutorial
<ul>
<li>this means much less fumble finger type mistakes</li>
</ul>
</li>
<li>~2hrs 39 min to complete from httpd.conf setup to form submission.
<ul>
<li>with distractions, a mySQL db, and a reCaptcha</li>
<li>I&#8217;ve clearly spent more time complaining about Zend Framework than it would take to complete the mini app in Symfony</li>
</ul>
</li>
<li>The only config files I touched were
<ul>
<li>config/ProjectConfiguration.class.php to use Doctrine instead of propel auto-magically</li>
</ul>
<ul>
<li>config/doctrine/schema.yml to define the db tables</li>
</ul>
<ul>
<li>config databases.yml was set up from the command line so you be the judge on that one</li>
</ul>
</li>
</ul>
<h4>Zend:</h4>
<ul>
<li>Configuration done in:
<ul>
<li>Bootstrap file configuration</li>
</ul>
<ul>
<li>appliation.ini configuration</li>
</ul>
</li>
<li>the zf tutorial expects you to write around<strong> 515 lines of code</strong> to do the same thing as Symfony
<ul>
<li>that&#8217;s from the tutorial text not the well commented source code.</li>
</ul>
</li>
<li>Also there promise of a &#8220;30-minute tour&#8221; can&#8217;t mean that you can program it in 30 minutes</li>
</ul>
<h2>Conclusions</h2>
<p><a href="http://framework.zend.com/" target="_blank">Zend Framework</a> is not bad, compared to using plain PHP there are some significant efficiency gains to be made.  However, when compared with <a href="http://www.symfony-project.org/">Symfony</a> and other frameworks, like <a href="http://www.djangoproject.com/" target="_blank">Django</a> &amp; <a href="http://rubyonrails.org/">Rails</a>,  it&#8217;s missing key features found in modern Web Development frameworks.  The tutorial I described here demonstrated the efficiency issues of not having code generation for the Model layer.  Two other key features are generated CRUD&#8217;s for backend site management, and a full MVC plugins like <a href="http://www.symfony-project.org/">Symfony</a>, <a href="http://rubyonrails.org/">Rails</a>, &amp; <a href="http://www.djangoproject.com/" target="_blank">Django</a> all have.</p>
<p>The long term ramifications of not having plugins and generated code accelerating your project are corners cut on quality, reduced features, scaling problems, and less competitive bids.  The lack of robust plugins in Zend also means that it will never be able have as many features as frameworks that do have Plugins.  Not having code generation means that developers are spending too much time writing mindless getter&#8217;s, setter&#8217;s, &amp; data grids and not enough time focusing on the core features of the project, or worse they are making compromises in quality to make deadlines.</p>
<p>I don&#8217;t believe that the <a href="http://framework.zend.com/" target="_blank">Zend Framework</a> is so far behind that it can&#8217;t catch up.  In certain areas it&#8217;s actually ahead of the game, however those areas tend to not be fascinating edge cases I get to use every so often, and not features I use on every site every day.  My suggestion for Zend is use the Model layer examples available (<a href="http://ar.rubyonrails.org/" target="_blank">Active Record</a>,  <a href="http://www.sqlalchemy.org/" target="_blank">SQLAlchemy</a>, <a href="http://www.doctrine-project.org/">Doctrine</a>) and  do something like that.  <a href="http://ruben.savanne.be/articles/integrating-zend-framework-and-doctrine" target="_blank">Doctrine already integrates well with Zend</a>, maybe that would be a good option.  Then start generating admin interfaces or <a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" target="_blank">CRUD</a>&#8216;s, this is huge, I find all kinds of ways to use these things to add value to my projects with a little typing on the command line.  Finally Plugins, the most important consideration when reviewing a framework or <a href="http://en.wikipedia.org/wiki/Content_management_system">CMS</a>.  The quantity and quality of plugins demonstrates the quality of the development tool.  It also means that there are developers out there that care about the tool outside of the core team.</p>
<p>If you are interested in learning more about Symfony there are excellent tutorials like the <a href="http://www.symfony-project.org/jobeet/1_2/Doctrine/en/">Jobeet example app</a>, a<a href="http://www.symfony-project.org/cookbook/1_2/en/"> cookbook</a>, a <a href="http://www.symfony-project.org/book/1_2/">guide book</a>, a <a href="http://www.symfony-project.org/cookbook/1_2/en/">reference book</a>, an <a href="http://www.symfony-project.org/api/1_2/">API</a>, and more on the <a href="http://www.symfony-project.org/doc/1_2/" target="_blank">symfony doc&#8217;s page</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertspeer.com/blog/symfony-refactor-of-the-zend-quick-start-tutorial/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
	</channel>
</rss>
