<rss version="0.92">
  <channel>
    <title>Jim Plush's Programming Paradise</title>
    <link>http://www.litfuel.net/plush/</link>
    <description>Software Architect - Blue Rover Labs</description>
    <language>en</language>
        <item>
      <title>Super Secret Invites are going out!</title>
      <description>Exciting times at the new job. We're releasing a handful of super secret invites to the new site. Crazy days to come. Wish I could say more at this time. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
</description>
      <pubDate>Thu, 10 Dec 2009 04:09:32 UTC</pubDate>
      <link>http://www.litfuel.net/plush/?postid=194</link>
    </item>
        <item>
      <title>Farewell Panasonic</title>
      <description>After 5+ years at Panasonic I've decided to accept a new position with Blue Rover Labs. It will be an exciting change back to start up life and I'm looking forward to getting started. I bought a Civic Hybrid with carpool stickers this morning so I'm all set for the commute :)&lt;br /&gt;
&lt;br /&gt;
It was a pleasure to work with everyone at Panasonic. They really do take care of their employees and that really made the decision difficult. &lt;br /&gt;
&lt;br /&gt;
We'll see what happens in the future!&lt;br /&gt;
&lt;br /&gt;
</description>
      <pubDate>Fri, 13 Nov 2009 21:07:07 UTC</pubDate>
      <link>http://www.litfuel.net/plush/?postid=193</link>
    </item>
        <item>
      <title>If Zend Form was a girl I'd marry it</title>
      <description>So a few months ago I took the leap and spent some time getting down and dirty with Zend_Form. The elements, decorators, display sub groups, validations, filtering, etc...&lt;br /&gt;
In our new project we are now creating a single form class and are able to use that for our edit form, creation form and also a method for &quot;read only&quot; that will just display the contents properly all using the same form code. We have custom validators plugging into the elements. It's just a beautiful thing. Once you get the hang of it whipping out quality forms is a snap. &lt;br /&gt;
&lt;br /&gt;
Nice job Framework devs&lt;br /&gt;
&lt;br /&gt;
</description>
      <pubDate>Fri, 31 Jul 2009 16:49:40 UTC</pubDate>
      <link>http://www.litfuel.net/plush/?postid=191</link>
    </item>
        <item>
      <title>I'll be speaking at ZendCon 2009</title>
      <description>I'm currently set to speak at ZendCon 2009 on the topic of &quot;How to run an enterprise PHP Shop&quot; (&lt;a href=&quot;http://zendcon.com/&quot;  class=&quot;ng_url&quot;&gt;http://zendcon.com/&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
I'd love to see what people may be most interested in talking about. I've be a lead developer at McAfee and Panasonic, two large, very different corporations. &lt;br /&gt;
&lt;br /&gt;
Here's what my blurb on the Zend site says:&lt;br /&gt;
&lt;br /&gt;
&quot;How to run an enterprise PHP Shop&lt;br /&gt;
&lt;br /&gt;
Speaker: Jim Plush&lt;br /&gt;
&lt;br /&gt;
In this session we'll take a look at how to successfully manage and lead PHP teams. We'll cover finding and interviewing PHP developers, the processes involved with producing products (build, qa, release, continuous integration, and development processes), building the team, team standards (coding, documentation, unit testing, reviews), providing ongoing education, and preventing developer burn out. We will also touch on the balacing act between process and productivity.&lt;br /&gt;
&lt;br /&gt;
22.10.2009 | 09:15 bis 10:15 Uhr &quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I'm currently working on the outline for the talk. It's only an hour and I have a lot to cover so if there's anything you want me to focus on just drop me a comment. Here is my super rough outline so far:&lt;br /&gt;
&lt;br /&gt;
How to find, interview and hire PHP developers&lt;br /&gt;
How to manage teams&lt;br /&gt;
Coding Standards&lt;br /&gt;
Testing standards&lt;br /&gt;
Build Processes&lt;br /&gt;
Release Processes&lt;br /&gt;
Bug reporting and mitigation processes (bug scrub meetings with steering team)&lt;br /&gt;
Requirements gathering&lt;br /&gt;
Deploying Code&lt;br /&gt;
Training the team&lt;br /&gt;
Unit Testing&lt;br /&gt;
Continuous Integration Servers&lt;br /&gt;
System Testing&lt;br /&gt;
Weekly team meetings&lt;br /&gt;
Pre-release Bug Parties, prizes for most show stoppers, most bugs found&lt;br /&gt;
Tools we use at Panasonic (svn, why not to use telelogic change, phing, phpunit, zend framework, twiki wiki)&lt;br /&gt;
Team Building&lt;br /&gt;
Importance of certifications&lt;br /&gt;
Importance of the balance between process and performance&lt;br /&gt;
Wikis for collaboration&lt;br /&gt;
Why we chose Zend Framework&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
</description>
      <pubDate>Thu, 30 Jul 2009 04:53:31 UTC</pubDate>
      <link>http://www.litfuel.net/plush/?postid=190</link>
    </item>
        <item>
      <title>Rethinking Zend Models Part 4 - Create new user</title>
      <description>I've gone ahead and added the createuserAction to my indexController to illustrate how we could reuse all the code previously written to validate and save creating a new user. If you want to view the change log to see the code I added to support this, you can view it here: &lt;a href=&quot;http://code.google.com/p/plushcode/source/detail?r=23&quot;  class=&quot;ng_url&quot;&gt;http://code.google.com/p/plushcode/source/detail?r=23&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Here's what our createuserAction code looks like now&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;ol&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt; public &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; createuserAction&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;    	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// we're going to be creating a user&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;    	&lt;span style=&quot;color: #0000ff;&quot;&gt;$userRepo&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; user_UserRepository&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;    	&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$userRepo&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getNewUser&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;    	&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;    	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// pass the form the validator it needs to work with&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;    	&lt;span style=&quot;color: #0000ff;&quot;&gt;$form&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; forms_CreateUserForm&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.php.net/array&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;array&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'Validator'&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; user_validation_Default&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;    	&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;		&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// find a user with id 1 in the DB&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;    	&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getRequest&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;isPost&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	            &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$form&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;isValid&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$_POST&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;	   &lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	    		&lt;span style=&quot;color: #0000ff;&quot;&gt;$values&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$form&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getValues&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;		        &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// let's update the user's email address to what was posted from the form&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;		        &lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;setEmailAddress&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$values&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'email'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;		        &lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;		        &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// update the profile's nickname&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;		        &lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;Profile&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;setNickname&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$values&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'nickname'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;        &lt;/li&gt;&lt;li&gt;		        &lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;		    	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// check to make sure the whole user object is valid with these new changes&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;		        &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;!&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;isValid&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;		        	&lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;view&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;errors&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getMessages&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;		        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #b1b100;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;		        	&lt;span style=&quot;color: #0000ff;&quot;&gt;$userRepo&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;		        	&lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;view&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;message&lt;/span&gt; = &lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;USER CREATED!&quot;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;		        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	    	&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;    	&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;    	&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;    	&lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;view&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;form&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$form&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;    	&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
</description>
      <pubDate>Wed, 22 Jul 2009 20:43:27 UTC</pubDate>
      <link>http://www.litfuel.net/plush/?postid=189</link>
    </item>
        <item>
      <title>Rethinking Zend Models Part 3 - Validation</title>
      <description>I've gone ahead and added validation to our test project: &lt;a href=&quot;http://code.google.com/p/plushcode/source/browse/#svn/trunk/ZendModel/application/default/models&quot;&gt;http://code.google.com/p/plushcode/source/browse/#svn/trunk/ZendModel/application/default/models&lt;/a&gt;&lt;br /&gt;
If you take a look at the indexController you'll now see I've added an updateAction that uses a Zend Form component. &lt;br /&gt;
&lt;br /&gt;
The goal of the validation was to provide context sensitive validation on a model. A model by itself might not know if it's valid or not so you'll want to apply different contexts depending on what the client operation is. Saving an order might have a different validation need than shipping an order. Instead of hacking a bunch of if/else statements you can simple say &lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;ol&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$order&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;setValidator&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; order_validation_NewOrder&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// OR&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$order&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;setValidator&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; order_validation_ShipOrder&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;!&lt;span style=&quot;color: #0000ff;&quot;&gt;$order&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;isValid&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;$messages&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$order&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getMessages&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
and $order-&gt;isValid() will operate on that context object. The form object get's pass a validator so it can also operate on the same validator chains as the model so you don't have to duplicate that logic.&lt;br /&gt;
&lt;br /&gt;
Anyway, I think it can be improved so take a look!&lt;br /&gt;
If you've downloaded and installed the code you'll be able to find the example on your local machine: http://youraddress/index/update&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
</description>
      <pubDate>Tue, 21 Jul 2009 22:03:12 UTC</pubDate>
      <link>http://www.litfuel.net/plush/?postid=188</link>
    </item>
        <item>
      <title>Followup on rethinking Zend Models with DDD -  Framework code included</title>
      <description>As a follow up to my previous post I'm going to post some live examples of model layer with Zend framework based on Domain Driven Design concepts. I've spent the past few days studying up on domain driven design as well as a lot of Martin Fowler's work in relation to domain modeling and I think I have at least some code to start with that could get some conversations rolling. The issue is Zend Framework doesn't have a formal model layer and it shouldn't. Models are very much domain specific to what you're working on. As I've mentioned in my previous post sometimes you need complex business logic that will need to rapidly change and adapt to growing business needs. Active record can only get you so far when complexity expands. &lt;br /&gt;
&lt;br /&gt;
I've posted a working Zend Framework project that has a basic working set of models so far. The current concept has a User who in turn owns a profile object. That profile object holds a nickname attribute that we can play around with. I have two tables users and profiles that are joined with a foreign key (user_id). Normally when you want profile information you'd just do a join and work with the result. What if that profile becomes context sensitive? What if a user can have a different profile based on the location he's in? Maybe he's a CIA agent and if he's overseas he needs a different profile to be covert. You'd now have to start adding conditions to your logic to account for this. Having the user own a profile object that can be injected at runtime allows for these contexts to be more manageable.&lt;br /&gt;
&lt;br /&gt;
What if your user is going to be used in a workflow engine, a piece of marketing business logic that operates on users, it will be nice to be able to pass around a complete User object that has well documented properties and APIs instead of forcing each business logic service to know the details of your database. &lt;br /&gt;
&lt;br /&gt;
Here is the google code repository you can checkout and play around with: &lt;a href=&quot;http://code.google.com/p/plushcode/source/browse/#svn/trunk/ZendModel&quot;  class=&quot;ng_url&quot;&gt;Google Code Repository for Zend Model project &lt;/a&gt;&lt;br /&gt;
It's all working, just create a database and dump in the zendmodel_DB.sql file, change your config.ini file settings and you're all set assuming you handle your apache settings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Take a look at the default/controllers/IndexController.php file for how the client code will be used.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;ol&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// instantiate the user repository who will be in charge of building a proper user&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;$userRepo&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; user_UserRepository&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;        &lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// find a user with id 1 in the DB and grab their current nickname from the profile&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$userRepo&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;view&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;nickname&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;Profile&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getNickname&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;        &lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;		&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// set their nickname in their profile to something new&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;Profile&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;setNickname&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'tommy tom'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;        &lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// find the user again, it should pull the same object reference and not create a brand new object (Identity Map)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$userRepo&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;find&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;view&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;nickname2&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;Profile&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getNickname&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;; &lt;/div&gt;&lt;/li&gt;&lt;li&gt;        &lt;/li&gt;&lt;li&gt;      &lt;/li&gt;&lt;li&gt;        &lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// a fictional web service to check to see how popular your new nickname is&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;$profileService&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; services_ProfileService&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;$popularity&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$profileService&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;howCommonIsMyNickname&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;view&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;popularity&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$popularity&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;        &lt;/li&gt;&lt;li&gt;        &lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// let's update the user's email address&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;setEmailAddress&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'newdude@yahoo.com'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;        &lt;/li&gt;&lt;li&gt;        &lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// you can manually commit the save to the database like this or in the destruct method of ObjectManager &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// it will do it automatically for you, this will save all the changes we've made to all our objects&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// using the unit of work pattern in ObjectManager, the profile and the user will get updated&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;        ObjectManager::&lt;span style=&quot;color: #006600;&quot;&gt;performOperations&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
We have a User model and we have some supporting files around it. &lt;br /&gt;
in models/user/ you'll see some files:&lt;br /&gt;
/User.php&lt;br /&gt;
/UserMapper.php&lt;br /&gt;
/UserRepository.php&lt;br /&gt;
&lt;br /&gt;
Each one plays a role within the domain User.php is the model itself that models a user in our system. It contains no SQL or knowledge of the persistence layer and can be passed around to any app on ths system. UserMapper.php is our basic DB Mapper that is in charge of doing the dirty work of putting things into our database. UserRepository is the default User Factory for creating a valid User object along with it's dependencies. Because this could be context sensitive we can contain that logic in a central place in there or add another Repository. &lt;br /&gt;
&lt;br /&gt;
if you look in models/infrastructure/ObjectManager.php you'll see this file is a combination identity map and unit of work. It's job is to make sure if we have already instantiated a User object for example that we get back the same exact one and don't try to recreate it. It's basically an object cache. &lt;br /&gt;
&lt;br /&gt;
Anyway, take a look and let's talk about what's right and what's wrong and how we can improve the complex domain model with Zend Framework. I'd like to start building on this example with everyday issues like logging, authentication, transactions, validation, unit tests,  etc...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
</description>
      <pubDate>Fri, 17 Jul 2009 00:59:14 UTC</pubDate>
      <link>http://www.litfuel.net/plush/?postid=187</link>
    </item>
        <item>
      <title>Rethinking the Zend Models</title>
      <description>I'm currently in requirements mode for an upcoming project that should prove to be pretty complex. The current active record/table gateway patterns just aren't going to cut it for the complex business logic that's approaching. I'm starting to lean towards the domain model approach which would increase the initial complexity of the design but allow for the flexibility for future changes and features. The issue is with where to put your business logic? Most of the rails and Zend framework examples show a more active record type pattern which means that the business logic is tied into the persistence storage layer. &lt;br /&gt;
&lt;br /&gt;
For example...&lt;br /&gt;
$user = new User();&lt;br /&gt;
$user-&gt;salary = 100;&lt;br /&gt;
$user-&gt;updatePayroll();&lt;br /&gt;
$user-&gt;save();&lt;br /&gt;
&lt;br /&gt;
This works well for smaller apps where your models are tied tightly to your database structure however in my case I'll need to add the application layer above an existing database structure that may have 5 tables per object. For the example above I've diagrammed a possible solution&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://litfuel.net/plush/images/UserDomainSample.jpg&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
In this example I've created a User and Company class. Each one holds it's own data and basic operations. There is no sql in these, no direct knowledge of the outside world. Each model has a corresponding Mapper class (data mapper pattern) that knows how to save, find, create and delete it's own model. On top of those layers will sit a service layer that handles the real business logic. The UserPayrollService deals specifically with managing payroll for a user. UserAuthService is strictly for authenticating and logging out a user. As more and more complexity is added such as the need to have a User as part of a workflow engine I can simply create a new service or modify an existing one to implement the new business logic. Some additional benefits are that you can show the diagrams to your stakeholders and they can see concrete evidence that you've captured their business requirements as well as having the components testable on an individual level. &lt;br /&gt;
&lt;br /&gt;
here are some examples of how it could be used...&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;ol&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;* high level use case for an immediate login and update of salary&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$userAuth&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; UserAuthService&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$userAuth&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;authorize&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$_request&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'email'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;$_request&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'password'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	&lt;span style=&quot;color: #0000ff;&quot;&gt;$payroll&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; UserPayrollService&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	&lt;span style=&quot;color: #0000ff;&quot;&gt;$payroll&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;updateSalary&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;100000&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	&lt;span style=&quot;color: #0000ff;&quot;&gt;$currentPay&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getSalary&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// currentPay would now equal 100000&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #b1b100;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// auth fail&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;ol&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;* example of creating a new user&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$userMapper&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; UserMapper&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;!&lt;span style=&quot;color: #0000ff;&quot;&gt;$userMapper&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;userExists&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$_request&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'email'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; User&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;email&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$_request&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'email'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;firstName&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$_request&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'firstName'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;lastName&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;$_request&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'lastName'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	&lt;span style=&quot;color: #0000ff;&quot;&gt;$userMapper&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;save&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$user&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	redirect&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'/home'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #b1b100;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;	&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;// user already exists&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;font-family: 'Verdana', Arial, monospace; font-size: 12px; font-weight: normal;&quot;&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Anyone have any thoughts on this implementation? What has served you well? &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
</description>
      <pubDate>Tue, 14 Jul 2009 20:06:34 UTC</pubDate>
      <link>http://www.litfuel.net/plush/?postid=186</link>
    </item>
        <item>
      <title>I believe I'm a MySQL Certified Developer Now</title>
      <description>I just passed the 2nd test over the weekend for the MySQL developer certification. It was definitely harder than the Zend Certified developer test. There is no way I could have passed without some serious studying. The test covered tons of topics such as Client/Server Concepts, Joins,The mysql Client Program,,Subqueries,Connectors ,Views,Data Types ,Importing and Exporting Data,Identifiers,User Variables,Databases,Prepared Statements,Tables and Indexes,Stored Routines,Querying for Data,Triggers,SQL expressions,Obtaining Database Metadata,Updating Data,Debugging MySQL Applications,Basic Optimizations. &lt;br /&gt;
&lt;br /&gt;
It's a two part, 70 questions per part test. I would definitely suggest getting the study guide as well as reading the online manual.&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.ecocomputer.it/immagini/loghi/mysql_certified.gif&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
</description>
      <pubDate>Tue, 09 Jun 2009 00:05:40 UTC</pubDate>
      <link>http://www.litfuel.net/plush/?postid=185</link>
    </item>
        <item>
      <title>The Right MySQL Engine for High Capacity Servers</title>
      <description>As you may know there are many storage engines in MySQL MyISAM, InnoDB, Falcon, CSV, Blackhole, Archive, etc...There is a storage engine that comes with the MySQL Max Download called the &quot;Blackhole Engine&quot;.  According to the documentation it basically dumps it's storage to /dev/null. A storage engine that doesn't store anything? What good could that be?&lt;br /&gt;
&lt;br /&gt;
Well if you run in a high volume production system where you may have one or more master databases for writes/updates/deletes and a whole farm of slaves reading the log from that master than this may be of interest to you. The concept is pretty simple. You have a Master database that is in charge of all your inserts, deletes, updates which in turn has connections to all those slaves. That means network traffic, disk I/O, CPU power all taking up resources that you really want for the Master's primary goal of collecting and maintaining data. &lt;br /&gt;
&lt;br /&gt;
This is where the Blackhole Engine comes in. The actual process of logging the SQL statements that hit the Master database that the slaves consume lives above the storage engine level in the main MySQL server level. So with the Blackhole Engine piping data to /dev/null you can actually use it as a proxy to your slaved databases without the need to duplicate the data on that machine (it could very well be on the same machine!). See below for an example image...&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.litfuel.net/plush/images/blackholemysql.jpg&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
What you then have is the Master only replicating to one database, increasing the Master's capacity to process transactions. The slaves consume the log file from the Blackhole server. It acts as a proxy at this point, with the benefit of freeing up resources on the Master's server. This could also benefit multi continent replication set ups where you can have farms of blackhole servers farming data to farms of slaves around the global for faster local access times. The possibilities are endless!&lt;br /&gt;
&lt;br /&gt;
</description>
      <pubDate>Thu, 23 Apr 2009 04:39:55 UTC</pubDate>
      <link>http://www.litfuel.net/plush/?postid=183</link>
    </item>
      </channel>
</rss>