<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:content="http://purl.org/rss/1.0/modules/content/">

    <channel>
    
    <title>The Pope Is Dead</title>
    <link>http://www.thepopeisdead.com/</link>
    <description>Just another web development blog...</description>
    <dc:language>en</dc:language>
    <dc:creator>mute.pop3@gmail.com</dc:creator>
    <dc:rights>Copyright 2009</dc:rights>
    <dc:date>2009-12-22T14:59:01+00:00</dc:date>
    <admin:generatorAgent rdf:resource="http://expressionengine.com/" />
    

    <item>
      <title>New Zend_Application feature/update</title>
      <link>http://www.thepopeisdead.com/main/comments/new_zend_application_feature_update/</link>
      <guid>http://www.thepopeisdead.com/main/comments/new_zend_application_feature_update/#When:14:59:01Z</guid>
      <description><![CDATA[<p>
Just noticed this in the trunk of ZF, probably in 1.10 too. You do not now need to register the default resource autoloader for your default module, you can now simply put appnamespace = &#8220;myNamepase&#8221; in the app config. This will register the default resources for your default module.
<br />

</p>]]></description>
      <dc:subject>Zend Framework</dc:subject>
      <dc:date>2009-12-22T14:59:01+00:00</dc:date>
    </item>

    <item>
      <title>New Storefront Example Additions</title>
      <link>http://www.thepopeisdead.com/main/comments/new_storefront_example_additions/</link>
      <guid>http://www.thepopeisdead.com/main/comments/new_storefront_example_additions/#When:14:26:00Z</guid>
      <description><![CDATA[<p>
I have added search functionality to the Storefront example using Zend_Search_Lucene from the Zend Framework 1.8: Web Application Development book, I will hopefully get some time to write about this over christmas, for now though if you are interested you can download the code for the Google code sites trunk.
</p>
<p>
<a href="http://code.google.com/p/zendframeworkstorefront/">ZF Storefront Example on Google Code</a>
</p>
<p>
svn checkout <a href="http://zendframeworkstorefront.googlecode.com/svn/trunk/">http://zendframeworkstorefront.googlecode.com/svn/trunk/</a> zendframeworkstorefront-read-only
</p>
<p>Enjoy...</p>]]></description>
      <dc:subject>Zend Framework</dc:subject>
      <dc:date>2009-12-13T14:26:00+00:00</dc:date>
    </item>

    <item>
      <title>Dependency Injection</title>
      <link>http://www.thepopeisdead.com/main/comments/dependency_injection/</link>
      <guid>http://www.thepopeisdead.com/main/comments/dependency_injection/#When:21:10:01Z</guid>
      <description><![CDATA[<p>
    For a while now I have been looking at Dependency Injection in PHP and
    have been experimenting with the Yadif DI Container, after much thought I 
    decided to stop creating the article on ZF and Yadif as I now believe that 
    in PHP a DI Container is overkill. This article is therefore an explaination 
    of the general DI principles that we all can use to improve our code and 
    why DI Containers are overkill in PHP.
</p>

<h4>Dependency injection (the problem)</h4>
<p>
    Dependency Injection is a design pattern that deals with object
    configuration or object dependencies. By a dependency we mean that an
    Object uses another Object or Service, this brings us to the problem of
    how an Object handles it supporting services. The easiest way to look
    at this is through an example, consider the following class.
</p>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="kw2">class</span> Foo</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">$_db</span><span class="sy0">;</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> __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; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span>_db <span class="sy0">=</span> <span class="kw2">new</span> dbConnection<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="co1">// other methods..</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li></ol><div class="foot">Parsed in 0.008 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
    In class <em>Foo</em> we need to use the supporting database connection, to do
    this we instantiate a new <em>dbConnection</em> class in Foo’s constructor. This
    seems like a totally reasonable way to give our class access to the
    database connection, however by doing this we are giving <em>Foo</em> control
    over its own configuration (dependencies); this causes us the following
    problems.
</p>
<ul>
    <li>We cannot replace the database <em>dbConnection</em> instance when testing as we have no control over its instantiation.</li>
    <li><em>Foo</em> must know how to configure the database connection which breaks the encapsulation of our object.</li>
    <li>We cannot easily change the dependencies of <em>Foo</em>, to do so we must edit the code.</li>
</ul>
<p>
    So basically when we have a new call within our class we create a tight
    coupling between our objects. To solve this problem we need to
    configure the object from the outside rather than from within, we can
    do this using Dependency Injection which injects the dependencies into
    the object and takes control over the objects dependencies.
</p>

<h4>Types of dependency injection</h4>
<p>
    To start we will look at some basic types of Dependency Injection, we
    can easily use these techniques in any application without the need for
    a Dependency Injection framework, though we still use these techniques
    even with a framework.
</p>

<h5>Constructor based injection</h5>
<p>
    Constructor injection is where we inject our dependencies via the
    objects constructor method; if we now go back to the <em>Foo</em> example we can
    refactor that class to support constructor injection.
</p>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="kw2">class</span> Foo</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">$_db</span><span class="sy0">;</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> __construct<span class="br0">&#40;</span>dbConnection <span class="re1">$db</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; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span>_db <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_db <span class="sy0">=</span> <span class="re1">$db</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="co1">// other methods..</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li></ol><div class="foot">Parsed in 0.007 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
    We can see that we have only had to make minor changes to the class to
    implement constructor injection. To do this we now pass the
    <em>dbConnection</em> class into <em>Foo</em> via a constructor parameter, meaning to use
    <em>Foo</em> we now do:
</p>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="re1">$foo</span> <span class="sy0">=</span> <span class="kw2">new</span> Foo<span class="br0">&#40;</span><span class="kw2">new</span> dbConnection<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li></ol><div class="foot">Parsed in 0.004 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
    The <em>dbConnection</em> class is now injected into <em>Foo</em>, meaning we can easily
    replace it and have removed the responsibility of instantiation from
    <em>Foo</em>.
</p>
<p>
    As we can see this is very simple and I am sure we have all already
    done similar things in our code but maybe without knowing. We can also
    further improve this by introducing an interface, currently the
    constructor parameter is type hinted as <em>dbConnection</em> meaning we can
    only pass in instances of <em>dbConnection</em> or subclasses of it.
</p>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="kw2">interface</span> IdbConnection</div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw2">class</span> myDbConnection implements IdbConnection</div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw2">class</span> testDbConnection implements IdbConnection</div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw2">class</span> Foo</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">$_db</span><span class="sy0">;</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> __construct<span class="br0">&#40;</span>IdbConnection <span class="re1">$db</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; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span>_db <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_db <span class="sy0">=</span> <span class="re1">$db</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="co1">// other methods..</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li></ol><div class="foot">Parsed in 0.011 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
    By introducing an interface for <em>dbConnection</em> we can now easily create
    many different types of <em>dbConnection</em> that <em>Foo</em> can use, <em>Foo</em> will know
    how to use each connection type as they will all share the same public
    interface. Generally this is good practice when injecting dependencies
    as it make our implementation much more flexible.
</p>

<h5>Setter based injection</h5>
<p>
    Setter based injection is just as simple as constructor based
    injection, however this time rather than providing our dependencies in
    the construct we provide them using a setter method.
</p>
<p>
    Going back to our example we can refactor <em>Foo</em> to use setter injection.
</p>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="kw2">class</span> Foo</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">$_db</span><span class="sy0">;</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> __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><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> setDb<span class="br0">&#40;</span>IdbConnection <span class="re1">$db</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; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span>_db <span class="sy0">=</span> <span class="re1">$db</span><span class="sy0">;</span> &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">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> getDb<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; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_db<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="co1">// other methods..</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li></ol><div class="foot">Parsed in 0.011 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
    We can see this is a fairly simple refactoring of <em>Foo</em>, this time we can
    inject our dependency via the setter and retrieve it via its getter. So
    which type of injection is best? Well really both are valid, using
    constructor based injection you can be certain that your dependency
    will not be forgotten to be injected as they are required to
    instantiate the object, with setter based injection you could forget to
    inject your dependency. However, with setter based injection you can
    get around this using Lazy Injection, which we will look at next.
</p>

<h5>Lazy injection</h5>
<p>
    When using setter based injection we could possibly forget to inject a
    dependency, also if we have a large amount of dependencies our code
    could look like this:
</p>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="re1">$foo</span> <span class="sy0">=</span> <span class="kw2">new</span> Foo<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">$foo</span><span class="sy0">-&gt;</span><span class="me1">setDb</span><span class="br0">&#40;</span><span class="re1">$db</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$foo</span><span class="sy0">-&gt;</span><span class="me1">setCache</span><span class="br0">&#40;</span><span class="re1">$cache</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$foo</span><span class="sy0">-&gt;</span><span class="me1">setLog</span><span class="br0">&#40;</span><span class="re1">$log</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li></ol><div class="foot">Parsed in 0.006 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
    An awful lot to remember when instantiating an object, also we are lazy
    programmers so we never want to type this much!
</p>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="kw2">class</span> Foo</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">$_db</span><span class="sy0">;</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> __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><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> setDb<span class="br0">&#40;</span>IdbConnection <span class="re1">$db</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; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span>_db <span class="sy0">=</span> <span class="re1">$db</span><span class="sy0">;</span> &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">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> getDb<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; &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>_db<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span>_db <span class="sy0">=</span> <span class="kw2">new</span> dbConnection<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; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_db<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="co1">// other methods..</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li></ol><div class="foot">Parsed in 0.015 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
    Here we have simply added an if statement into the getter method for
    the database connection and if the _db property has not already been
    set we instantiate a new default <em>dbConnection</em> object. This affectively
    lazy loads our dependency for us if we have not already set one. By no
    means is this a perfect solution to our problem, what if we need to
    configure the dependent class too? Well, we then get horrible
    situations where we have configuration code with our classes or code
    that fetches the configuration or we go for more lazy configuration and
    so forth. So this is not perfect but at least it does solve some of our
    problems, this is why you will notice that I use it a lot in the
    Storefront application!
</p>

<h5>Unified Constructor</h5>

<p>
    Another important technique to note is the Unified Constuctor, this is used 
    in many ZF components already and provides a powerful way to configure an 
    object. Whilst this is not strictly Dependency Injection we should be aware
    of it as it can be used in conjunction with Lazy Injection to good affect.
</p>
<p>
    The idea of a unified Constuctor is to allow options/config to be passed into
    the constructor of the object that requires configuration, this then creates
    a construct that looks the same for many objects giving us the unified name.
</p>
<p>
    To fully explain lets look at an example.
</p>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="kw2">class</span> Foo</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">$_db</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">$options</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; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">setOptions</span><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; <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> setOptions<span class="br0">&#40;</span><span class="re1">$options</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; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$options</span> instanceof Zend_Config<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$options</span> <span class="sy0">=</span> <span class="re1">$options</span><span class="sy0">-&gt;</span><span class="me1">toArray</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; <span class="br0">&#125;</span> <span class="kw1">elseif</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/is_array"><span class="kw3">is_array</span></a><span class="br0">&#40;</span><span class="re1">$options</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">'setOptions() expects either an array or a Zend_Config object'</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &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; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re1">$options</span> <span class="kw1">as</span> <span class="re1">$key</span> <span class="sy0">=&gt;</span> <span class="re1">$value</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$method</span> <span class="sy0">=</span> <span class="st0">'set'</span> <span class="sy0">.</span> <a href="http://www.php.net/ucfirst"><span class="kw3">ucfirst</span></a><span class="br0">&#40;</span><span class="re1">$key</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/method_exists"><span class="kw3">method_exists</span></a><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">,</span> <span class="re1">$method</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="re1">$method</span><span class="br0">&#40;</span><span class="re1">$value</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</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> setDb<span class="br0">&#40;</span>IdbConnection <span class="re1">$db</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; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span>_db <span class="sy0">=</span> <span class="re1">$db</span><span class="sy0">;</span> &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">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> getDb<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; &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>_db<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span>_db <span class="sy0">=</span> <span class="kw2">new</span> dbConnection<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; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_db<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 class="foot">Parsed in 0.044 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
    So here we can see that <em>Foo</em> now accepts $options in its construct, $options
    will be either and array or Zend_Config instance that contains the objects
    configuration. The setOptions() method is called from the construct and 
    simply iterates over the $options array and calls the setters that match 
    the keys in that array. This means that along with the Lazy Injection we 
    can now override the default database connection using the unified construct. 
</p>    
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="re1">$opts</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">'db'</span> <span class="sy0">=&gt;</span> <span class="kw2">new</span> MyDbConnection<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$a</span> <span class="sy0">=</span> <span class="kw2">new</span> Foo<span class="br0">&#40;</span><span class="re1">$options</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li></ol><div class="foot">Parsed in 0.013 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
    This again lets us configure our objects from outside and breaks up those
    tight dependencies, there are some obvious drawbacks to the unified 
    construct mainly that intellisense does not work and the code is
    not as clear as it could be as you need to know what the options are, though
    they do match the setters anyway.
</p>

<h4>Dependency Injection Containers</h4>
<p>
    At this point I was going to show how we can use the Yadif DI Container to 
    move all object configuration outside of our objects, however as I mentioned
    earlier after some discussion and research I now believe that the use of a
    DI container in PHP may be overkill in most situations.
</p>
<p>
    So what does a DI Container look like?
</p>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="re1">$container</span> <span class="sy0">=</span> <span class="kw2">new</span> DIContainer<span class="br0">&#40;</span><span class="re1">$config</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$foo</span> <span class="sy0">=</span> <span class="re1">$container</span><span class="sy0">-&gt;</span><span class="me1">getObject</span><span class="br0">&#40;</span><span class="st0">'Foo'</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li></ol><div class="foot">Parsed in 0.005 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
    The $config variable would contain a set a configuration instructions 
    that tells the container how various object or components should be 
    instantiated and configured. Therefore, we would retrieve all new objects
    via the container and would never use new to instantiate our objects, 
    pushing all instantiation and wiring to the container.
</p>
<p>
    So whats the problem? This does look like a very reasonable approach when
    you have many dependencies, however as PHP is a dynamic language that is 
    generally used in a web environment we have a problem with the amount of 
    objects that are created and potentially never used. Consider the following 
    diagram.  
</p>
<img src="/images/di/problem.png" />
<p>
    If we were to retrieve A from the DI Container the Container would 
    automatically instantiate six other objects, these in turn could create 
    other objects and so on. This in PHP can become impractical as generally
    we are running in a stateless environment and many of these objects may never
    be used and take up memory. In Java this approach does not matter so much as
    it is stateful and eventually the objects will be used. 
</p>
<p>
    With this in mind I would only use a DI Container if you are running PHP in
    some sort of stateful environment. For now I would suggest using a combination
    of Lazy Injection, Unified Constructor and Factories to wire you objects, 
    though a small DI Container used carefully can still be helpful. 
</p>

<h4>Conclusion</h4>

<p>
    A big part of Dependency Injection is helping us to create testable code, 
    all the manual DI techniques I have covered here help to create a testable
    codebase even without the use of a DI Container. Remember the biggest killers
    for testable code are:
</p>
<ul>
    <li>Global State</li>
    <li>new calls within your code</li>
    <li>Singletons (these are global state)</li>
    <li>Static calls (global state again...)</li>
    <li>PHP Function calls (global state yet again...)</li>
</ul>
<p>
    So to sum up, Dependency Injection techniques are very valuable in our 
    day-to-day programming, enabling us to create easy to test code. DI Containers
    probably should be used only with great care in PHP.
</p>

<p>
    <em>Footnote 1:</em> If you are interested in Yadif or want to see a DI Container in action I have 
    released code for the Storefront which I used in my experiments. <a href="http://code.google.com/p/zendframeworkstorefront/source/browse/#svn/branches/extended/dependencyInjection">Google Code - Yadif & Storefront</a>
</p>
<p>
    <em>Footnote 2:</em> Remember we can use Lazy Injection to guard against all the bad things
    for testability not just new calls. 
</p>
<p>
    <em>Footnote 3:</em> To guard against PHP core function cores which are in 
    the Global Scope we can make a proxy class.
</p>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="kw2">class</span> Php_Proxy</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> __call<span class="br0">&#40;</span><span class="re1">$method</span><span class="sy0">,</span> <span class="re1">$args</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; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/function_exists"><span class="kw3">function_exists</span></a><span class="br0">&#40;</span><span class="re1">$method</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st0">'Function : '</span> <span class="sy0">.</span> <span class="re1">$method</span> <span class="sy0">.</span> <span class="st0">' not found'</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <a href="http://www.php.net/call_user_func_array"><span class="kw3">call_user_func_array</span></a><span class="br0">&#40;</span><span class="re1">$method</span><span class="sy0">,</span> <span class="re1">$args</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>
<li class="li1"><div class="de1"><span class="co1">// We can then use the class like this</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$proxy</span> <span class="sy0">=</span> <span class="kw2">new</span> Php_Proxy<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">$proxy</span><span class="sy0">-&gt;</span><span class="me1">mysql_query</span><span class="br0">&#40;</span><span class="st0">'SELECT * FROM x'</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li></ol><div class="foot">Parsed in 0.022 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
    By creating a class that proxies to the global PHP functions we can now 
    cleany replace calls to them within our classes during testing.
</p>]]></description>
      <dc:subject>PHP, Zend Framework</dc:subject>
      <dc:date>2009-12-09T21:10:01+00:00</dc:date>
    </item>

    <item>
      <title>Zend Entity Notes On Rich Domain Objects</title>
      <link>http://www.thepopeisdead.com/main/comments/zend_entity_notes_on_rich_domain_objects/</link>
      <guid>http://www.thepopeisdead.com/main/comments/zend_entity_notes_on_rich_domain_objects/#When:21:46:00Z</guid>
      <description><![CDATA[<p>
I have been testing out Zend_Entity and was wondering how to inject
dependencies into the Domain Objects it creates, after some reading I
finally came up with the following prototype. Any suggestions on a
better solution are welcome :)
<p>
<h5>The Problem</h5>
<p>
Ok so the problem is that a Domain Object has a dependency on another
Domain Object (Not one produced by Zend_Entity, those dependencies are
already handled) or Service, Zend_Entity should not know about the
Dependencies as it is not a DI Container. So how can we get these
dependencies into the Domain Object?
</p>
<h5>Why Solve it?</h5>
<p>
Well if we can not have other dependencies to our Domain Objects we are
going to end up using our Domain Objects like simple DAO's which they
are not, this will walk us into the <a href="http://en.wikipedia.org/wiki/Anemic_Domain_Model">Anemic Domain Model</a>
</p>
<h5>Example Domain Object</h5>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="kw2">class</span> My_Model_Product</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="re1">$id</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="kw2">public</span> <span class="re1">$name</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;protected <span class="re1">$_mail</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> getState<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; &nbsp;<span class="kw1">return</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">'id'</span> <span class="sy0">=&gt;</span> <span class="re1">$this</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; &nbsp;<span class="st0">'name'</span> <span class="sy0">=&gt;</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">name</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<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> setState<span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a> <span class="re1">$state</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; &nbsp;<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$state</span> <span class="kw1">AS</span> <span class="re1">$k</span> <span class="sy0">=&gt;</span> <span class="re1">$v</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span><span class="re1">$k</span> <span class="sy0">=</span> <span class="re1">$v</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</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> setMail<span class="br0">&#40;</span><span class="re1">$m</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; &nbsp;<span class="re1">$this</span><span class="sy0">-&gt;</span>_mail <span class="sy0">=</span> <span class="re1">$m</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 class="foot">Parsed in 0.026 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
We can see that our Domain Object needs to use the Mail Service, so we
need to fulfill this dependency.
</p>
<h5>A possible solution</h5>
<p>
Ok here's my prototype :)
</p>
<h5>Changes to Yadif</h5>
<p>
I am using Yadif (<a href="http://github.com/beberlei/yadif">http://github.com/beberlei/yadif</a>) for Dependency Injection, but I need to add the ability to inject into an already created instance.
</p>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="coMULTI">/**</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* Injects dependents into an instance</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* </span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @param mixed $instance</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;* @return mixed</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp;*/</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> inject<span class="br0">&#40;</span><span class="re1">$instance</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; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/is_object"><span class="kw3">is_object</span></a><span class="br0">&#40;</span><span class="re1">$instance</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Yadif_Exception<span class="br0">&#40;</span><span class="st0">&quot;Must be a class instance&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &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; &nbsp; <span class="re1">$name</span> <span class="sy0">=</span> <a href="http://www.php.net/strtolower"><span class="kw3">strtolower</span></a><span class="br0">&#40;</span><a href="http://www.php.net/get_class"><span class="kw3">get_class</span></a><span class="br0">&#40;</span><span class="re1">$instance</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">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/array_key_exists"><span class="kw3">array_key_exists</span></a><span class="br0">&#40;</span><span class="re1">$name</span><span class="sy0">,</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_container<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Yadif_Exception<span class="br0">&#40;</span><span class="st0">&quot;Component '&quot;</span><span class="sy0">.</span><span class="re1">$name</span><span class="sy0">.</span><span class="st0">&quot;' does not exist in container.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &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; &nbsp; <span class="re1">$component</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_container<span class="br0">&#91;</span><span class="re1">$name</span><span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$scope</span> <span class="sy0">=</span> <span class="re1">$component</span><span class="br0">&#91;</span>self<span class="sy0">::</span><span class="me2">CONFIG_SCOPE</span><span class="br0">&#93;</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; <span class="re1">$componentReflection</span> <span class="sy0">=</span> <span class="kw2">new</span> ReflectionClass<span class="br0">&#40;</span><span class="re1">$component</span><span class="br0">&#91;</span> self<span class="sy0">::</span><span class="me2">CONFIG_CLASS</span> <span class="br0">&#93;</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; <span class="re1">$constructorArguments</span> <span class="sy0">=</span> <span class="re1">$component</span><span class="br0">&#91;</span>self<span class="sy0">::</span><span class="me2">CONFIG_ARGUMENTS</span><span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$setterMethods</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="re1">$component</span><span class="br0">&#91;</span>self<span class="sy0">::</span><span class="me2">CONFIG_METHODS</span><span class="br0">&#93;</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; <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re1">$constructorArguments</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Yadif_Exception<span class="br0">&#40;</span><span class="st0">&quot;Component '&quot;</span><span class="sy0">.</span><span class="re1">$name</span><span class="sy0">.</span><span class="st0">&quot;' has constructor injector and instance is already created.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &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; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re1">$setterMethods</span> <span class="kw1">as</span> <span class="re1">$method</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$methodName</span> <span class="sy0">=</span> <span class="re1">$method</span><span class="br0">&#91;</span>self<span class="sy0">::</span><span class="me2">CONFIG_METHOD</span><span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$params</span> <span class="sy0">=</span> <span class="re1">$method</span><span class="br0">&#91;</span>self<span class="sy0">::</span><span class="me2">CONFIG_PARAMETERS</span><span class="br0">&#93;</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; &nbsp; <span class="re1">$injection</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><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; <span class="kw1">if</span><span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re1">$method</span><span class="br0">&#91;</span>self<span class="sy0">::</span><span class="me2">CONFIG_ARGUMENTS</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$argsName</span> <span class="sy0">=</span> <span class="re1">$method</span><span class="br0">&#91;</span>self<span class="sy0">::</span><span class="me2">CONFIG_ARGUMENTS</span><span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$injection</span> <span class="sy0">=</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">injectParameters</span><span class="br0">&#40;</span><span class="re1">$argsName</span><span class="sy0">,</span> <span class="kw2">null</span><span class="sy0">,</span> <span class="re1">$params</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$componentReflection</span><span class="sy0">-&gt;</span><span class="me1">getMethod</span><span class="br0">&#40;</span><span class="re1">$methodName</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">isConstructor</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw <span class="kw2">new</span> Yadif_Exception<span class="br0">&#40;</span><span class="st0">&quot;Cannot use constructor in 'methods' setter injection list. Use 'arguments' key instead.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/call_user_func_array"><span class="kw3">call_user_func_array</span></a><span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="re1">$instance</span><span class="sy0">,</span> <span class="re1">$methodName</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re1">$injection</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &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; &nbsp; <span class="kw1">return</span> <span class="re1">$instance</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li></ol><div class="foot">Parsed in 0.092 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
So this is a very rough addition to Yadif and simply uses the current container implementation to inject dependents via setters, obviously construct injection is out of the question here.
</p>
<h5>Zend_Entity Event</h5>
<p>Next we need to add a new event into Zend_Entity.</p>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="kw2">class</span> My_Entity_Event_Test <span class="kw2">extends</span> Zend_Entity_Event_EventAbstract</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> postLoad<span class="br0">&#40;</span><span class="re1">$entity</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; &nbsp; <span class="re1">$f</span> <span class="sy0">=</span> Zend_Controller_Front<span class="sy0">::</span><span class="me2">getInstance</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; <span class="re1">$c</span> <span class="sy0">=</span> <span class="re1">$f</span><span class="sy0">-&gt;</span><span class="me1">getParam</span><span class="br0">&#40;</span><span class="st0">'bootstrap'</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getContainer</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; &nbsp; <span class="re1">$name</span> <span class="sy0">=</span> <a href="http://www.php.net/get_class"><span class="kw3">get_class</span></a><span class="br0">&#40;</span><span class="re1">$entity</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re1">$c</span><span class="sy0">-&gt;</span><span class="re1">$name</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$c</span><span class="sy0">-&gt;</span><span class="me1">inject</span><span class="br0">&#40;</span><span class="re1">$entity</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</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 class="foot">Parsed in 0.020 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>This class is then registered to Zend_Entity and postLoad is called every time an entity is created.</p>
<p>
Here we get the container from the bootsrap and then use the new inject method to populate the entities dependencies.
This is a pretty lazy way to do this, it's probably better to inject the container.
</p>
<h5>Example Object Wiring</h5>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="kw2">class</span> My_Objects <span class="kw2">extends</span> Yadif_Module</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="kw2">function</span> configure<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; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">bind</span><span class="br0">&#40;</span><span class="st0">&quot;My_Model_Bug&quot;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">to</span><span class="br0">&#40;</span><span class="st0">&quot;My_Model_Bug&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">bind</span><span class="br0">&#40;</span><span class="st0">&quot;My_Model_Product&quot;</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">-&gt;</span><span class="me1">to</span><span class="br0">&#40;</span><span class="st0">&quot;My_Model_Product&quot;</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">-&gt;</span><span class="me1">method</span><span class="br0">&#40;</span><span class="st0">'setMail'</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">args</span><span class="br0">&#40;</span><span class="st0">'My_Service_Mail'</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">bind</span><span class="br0">&#40;</span><span class="st0">&quot;My_Service_Mail&quot;</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 class="foot">Parsed in 0.034 seconds,  using GeSHi 1.0.7.21</div></div></div>
<p>
So here we have our object wiring where we setup the dependencies.
</p>
<h5>Example usage</h5>
<p>Finally here is an example usage:</p>
<div class="codeparser"><div class="php" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="re1">$sqlQueryBuilder</span> <span class="sy0">=</span> <span class="kw2">new</span> Zend_Db_Mapper_SqlQueryBuilder<span class="br0">&#40;</span><span class="re1">$c</span><span class="sy0">-&gt;</span><span class="me1">Max_Entity_Manager</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$sqlQueryBuilder</span><span class="sy0">-&gt;</span><span class="me1">fromEntity</span><span class="br0">&#40;</span><span class="st0">&quot;My_Model_Bug&quot;</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">-&gt;</span><span class="me1">where</span><span class="br0">&#40;</span><span class="st0">&quot;assigned_to = ?&quot;</span><span class="sy0">,</span> <span class="br0">&#40;</span>int<span class="br0">&#41;</span><span class="nu0">1</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">-&gt;</span><span class="me1">order</span><span class="br0">&#40;</span><span class="st0">&quot;bug_created DESC&quot;</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">$bugs</span> <span class="sy0">=</span> <span class="re1">$sqlQueryBuilder</span><span class="sy0">-&gt;</span><span class="me1">getResultList</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="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$bugs</span> <span class="kw1">AS</span> <span class="re1">$bug</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; Zend_Debug<span class="sy0">::</span><span class="me2">dump</span><span class="br0">&#40;</span><span class="re1">$bug</span><span class="sy0">-&gt;</span><span class="me1">getProducts</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$bug</span><span class="sy0">-&gt;</span><span class="me1">getProducts</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re1">$product</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Zend_Debug<span class="sy0">::</span><span class="me2">dump</span><span class="br0">&#40;</span><span class="re1">$product</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 class="foot">Parsed in 0.024 seconds,  using GeSHi 1.0.7.21</div></div></div>
<h5>Conclusion</h5>
<p>
Well this has been a very quick blog post but I hope these notes either spark debate or help someone, any suggestions are welcome.
</p>
<p>
I am still working on my Dependency Injection article, hopefully have that done soon ish and hopefully i will get some time to cover more on Zend_Entity...
</p>]]></description>
      <dc:subject>Web Development, Zend Framework</dc:subject>
      <dc:date>2009-10-28T21:46:00+00:00</dc:date>
    </item>

    <item>
      <title>Free chapter and more to come</title>
      <link>http://www.thepopeisdead.com/main/comments/free_chapter_and_more_to_come/</link>
      <guid>http://www.thepopeisdead.com/main/comments/free_chapter_and_more_to_come/#When:18:26:00Z</guid>
      <description><![CDATA[<p>
Packt have kindly sent me a chapter to post here, so here it is <a href="http://www.packtpub.com/files/4220-zend-framework-sample-chapter-7-the-shopping-cart.pdf">Chapter 7 Zend Framework 1.8 Web Application Development</a>
</p>
<p>
Now that I have more free time I will hopefully be posting some follow on articles here, these will continue on from the end of the book looking at new Zend Framework features and build upon the Storefront example application.
</p>
<p>
The first article planned on my whiteboard is Dependency Injection using the Yadif DI Container, this will hopefully be done in a month or so (I am taking it easy for a while) :)
</p>
]]></description>
      <dc:subject>Zend Framework</dc:subject>
      <dc:date>2009-09-29T18:26:00+00:00</dc:date>
    </item>

    <item>
      <title>Book released today!</title>
      <link>http://www.thepopeisdead.com/main/comments/book_released_today/</link>
      <guid>http://www.thepopeisdead.com/main/comments/book_released_today/#When:11:45:02Z</guid>
      <description><![CDATA[<p>
My book is now officially available <a href="http://www.packtpub.com/zend-framework-1-8-web-application-development/mid/25090917885o?utm_source=thepopeisdead.com&amp;utm_medium=affiliate&amp;utm_content=blog&amp;utm_campaign=mdb_000834">zend-framework-1-8-web-application-development/</a>
<br />
</p>
<p>
Thanks to everyone who helped!
<br />
</p>
<p>
<a href="http://www.packtpub.com/zend-framework-1-8-web-application-development/mid/25090917885o?utm_source=thepopeisdead.com&amp;utm_medium=affiliate&amp;utm_content=blog&amp;utm_campaign=mdb_000834">
<br />
<img src="http://images.packtpub.com/images/100x123/1847194222.png" />
<br />
</a>
<br />

</p>]]></description>
      <dc:subject>Personal, Web Development, Zend Framework</dc:subject>
      <dc:date>2009-09-22T11:45:02+00:00</dc:date>
    </item>

    <item>
      <title>Zend Framework Book Release Very Soon!</title>
      <link>http://www.thepopeisdead.com/main/comments/zend_framework_book_release_very_soon/</link>
      <guid>http://www.thepopeisdead.com/main/comments/zend_framework_book_release_very_soon/#When:09:47:00Z</guid>
      <description><![CDATA[<p>
We are in the final stages of getting the book finished and will hopefully be publishing by the end of the month!
</p>
<p>
I would like to thank all the people who have supported me during a very long year of writing this book, especially 
my wife who has been very patient with me, without her support none of this would have been possible, I love you very much.
</p>
<p>
It has been a very long road and I hope everyone enjoys the book!
</p>]]></description>
      <dc:subject>Personal, PHP, Web Development, Zend Framework</dc:subject>
      <dc:date>2009-09-05T09:47:00+00:00</dc:date>
    </item>

    <item>
      <title>Zend Framework Training</title>
      <link>http://www.thepopeisdead.com/main/comments/zend_framework_training/</link>
      <guid>http://www.thepopeisdead.com/main/comments/zend_framework_training/#When:17:55:00Z</guid>
      <description><![CDATA[<p>
I am thinking of providing some training courses on the Zend Framework once I have finished writing the book, I was wondering what people thought were the best subjects to cover and what sort of experience level people would like to see from a course, generally what would you like to see from a ZF course?
</p>
<p>
Thanks for any help :)
</p>]]></description>
      <dc:subject>PHP, Zend Framework</dc:subject>
      <dc:date>2009-08-17T17:55:00+00:00</dc:date>
    </item>

    <item>
      <title>Book finally announced, Zend Framework 1.8 Web Application Development</title>
      <link>http://www.thepopeisdead.com/main/comments/book_finally_announced_zend_framework_18_web_application_development/</link>
      <guid>http://www.thepopeisdead.com/main/comments/book_finally_announced_zend_framework_18_web_application_development/#When:01:24:00Z</guid>
      <description><![CDATA[<p>
My book is now officially announced <a href="http://www.packtpub.com/zend-framework-1-8-web-application-development/mid/25090917885o?utm_source=thepopeisdead.com&utm_medium=affiliate&utm_content=blog&utm_campaign=mdb_000834">zend-framework-1-8-web-application-development/</a>
</p>
<p>
How exciting, I should have the final chapter finished this weekend, then its just cleaning everything up and we are good to go!
</p>
<p>
<img src="http://images.packtpub.com/images/100x123/1847194222.png" />
</p>]]></description>
      <dc:subject>Personal, Web Development, Zend Framework</dc:subject>
      <dc:date>2009-06-27T01:24:00+00:00</dc:date>
    </item>

    <item>
      <title>Book coming along nicely, plus removing require_once from Zend Framework</title>
      <link>http://www.thepopeisdead.com/main/comments/book_coming_along_nicely_plus_removing_require_once_from_zend_framework/</link>
      <guid>http://www.thepopeisdead.com/main/comments/book_coming_along_nicely_plus_removing_require_once_from_zend_framework/#When:20:52:00Z</guid>
      <description><![CDATA[<p>
Just thought I would update the progress of the book, I am now on the final two chapters and the 1st draft version should be complete in about 3 weeks YAY!
</p>
<p>
I have been busy updating the Storefront over the weekend, which now has been optimized for the performance chapter and includes Model caching (which I hope is working....)
</p>
<p>
Anyway I will leave you with a nice little Ant Task for removing the require_once statements from the Zend library :)
</p>
<div class="codeparser"><div class="xml" style="font-family: monospace;color: #000066; border: 1px solid #d0d0d0; background-color: #f9f9f9;"><div class="head"><div class="right"><a href="#" rel="codeparser">[Download Source]</a></div><div>&copy; 2010 Keith Pope</div><div class="clear"></div></div><ol><li class="li1"><div class="de1"><span class="sc3"><span class="re1">&lt;target</span> <span class="re0">name</span>=<span class="st0">&quot;deploy&quot;</span><span class="re2">&gt;</span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;echo</span> <span class="re0">message</span>=<span class="st0">&quot;---- Removing require_once ----&quot;</span> <span class="re2">/&gt;</span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;replaceregexp</span> <span class="re0">byline</span>=<span class="st0">&quot;true&quot;</span><span class="re2">&gt;</span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;regexp</span> <span class="re0">pattern</span>=<span class="st0">&quot;require_once 'Zend/&quot;</span><span class="re2">/&gt;</span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;substitution</span> <span class="re0">expression</span>=<span class="st0">&quot;// require_once 'Zend/&quot;</span><span class="re2">/&gt;</span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;fileset</span> <span class="re0">dir</span>=<span class="st0">&quot;${basedir}/library/Zend&quot;</span> <span class="re0">excludes</span>=<span class="st0">&quot;**/*Autoloader.php&quot;</span> <span class="re0">includes</span>=<span class="st0">&quot;**/*.php&quot;</span> <span class="re2">/&gt;</span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/replaceregexp<span class="re2">&gt;</span></span></span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/target<span class="re2">&gt;</span></span></span></div></li></ol><div class="foot">Parsed in 0.012 seconds,  using GeSHi 1.0.7.21</div></div></div>]]></description>
      <dc:subject>Personal, PHP, Web Development, Zend Framework</dc:subject>
      <dc:date>2009-06-01T20:52:00+00:00</dc:date>
    </item>

    
    </channel>
</rss>