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

<channel>
	<title>LampJunkie.com - Everything related to Linux, PHP, MySQL, Apache, AJAX, Symfony and more</title>
	<atom:link href="http://www.lampjunkie.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lampjunkie.com</link>
	<description>Addicted to Linux  &#38; PHP</description>
	<pubDate>Mon, 30 Aug 2010 00:53:59 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Using symfony sfForms in a Zend Application</title>
		<link>http://www.lampjunkie.com/2010/06/using-symfony-sfforms-in-a-zend-application/</link>
		<comments>http://www.lampjunkie.com/2010/06/using-symfony-sfforms-in-a-zend-application/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 22:39:01 +0000</pubDate>
		<dc:creator>marc</dc:creator>
		
		<category><![CDATA[Featured]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[sfform]]></category>

		<category><![CDATA[Symfony]]></category>

		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.lampjunkie.com/?p=46</guid>
		<description><![CDATA[Recently I have been experimenting with the Zend Framework to look into it&#8217;s potential to be used in my future applications. Having been a symfony junkie for the last couple of years I was reluctant to try and use it, but I see that it has come a long way since last using it. I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I have been experimenting with the Zend Framework to look into it&#8217;s potential to be used in my future applications. Having been a symfony junkie for the last couple of years I was reluctant to try and use it, but I see that it has come a long way since last using it. I&#8217;m glad to see that there is finally the addition of the &#8220;zf&#8221; command line utility to help scaffold projects. While overall it&#8217;s a pretty solid framework, there are many things that I think are left to be desired when compared to symfony. The main thing I feel that is lacking is the form system within Zend.</p>
<p>I have grown to love symfony&#8217;s sfForm along with it&#8217;s sfWidget and sfValidator systems. I have been making heavy use of extending the sfFormObject class to easily create forms that update and return or create new model objects. Personally, I like to deal with domain objects as much as possible and not have to deal with passing around arrays in my action code. </p>
<p>So, I decided to see how easy it would be to use symfony&#8217;s sfForms within a Zend Application. I turns out that it&#8217;s really easy to get this working and have the best of both worlds!</p>
<p>For my example, I am going to base it on the <a href="http://framework.zend.com/manual/en/learning.quickstart.html">Zend Framework Quickstart Documentation</a>. I am going to assume that you have gone through the first couple of steps of creating the project, etc&#8230; What follows below is essentially a replacement for the <a href="http://framework.zend.com/manual/en/learning.quickstart.create-form.html">Create a Form</a> step.</p>
<h3>Step 1. - Add symfony to your Zend Project</h3>
<p>The first thing that you need to do is put the entire symfony core into your library so that you have access to the sfForm, sfWidget, and sfValidator classes, etc&#8230; So you simply grab symfony 1.4 from the installation page <a href="http://www.symfony-project.org/installation">here</a>.</p>
<p>Once you have the symfony core downloaded, you are going to copy the symfony lib directory to a new symfony directory in your project&#8217;s library folder.</p>
<p>At this point you&#8217;ll also want to create a Form directory to hold the forms class that you are going to create later on.</p>
<p>So you will have a structure like this:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">myproject</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">|&#8211;</span> application</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">|&#8211;</span> library</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">|</span> &nbsp; <span class="sy0">|&#8211;</span> Form</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">|</span> &nbsp; <span class="sy0">|&#8211;</span> symfony</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">|</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">|&#8211;</span> lib</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">|</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">|&#8211;</span> action</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">|</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">|&#8211;</span> addon</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">|</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">|&#8211;</span> etc<span class="sy0">&#8230;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">|</span> &nbsp; <span class="sy0">|&#8211;</span> Zend</div>
</li>
</ol>
</div>
<h3>Step 2. - Register some Autoloading</h3>
<p>Now we need to make sure that Zend will be able to autoload any of the core symfony classes that we are going to use. So we do this by modifying the application Bootstrap class so that it looks like this:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Bootstrap <span class="kw2">extends</span> Zend_Application_Bootstrap_Bootstrap</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> _initSymfonyAutoload<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">require_once</span> <span class="st0">&#39;symfony/lib/autoload/sfCoreAutoload.class.php&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sfCoreAutoload<span class="sy0">::</span><span class="me2">register</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Now at this point we are ready to use sfForms to our hearts content!</p>
<h3>Step 3. - Create a Form</h3>
<p>Create a &#8220;application/forms&#8221; directory if it doesn&#8217;t exist and add the following Guestbook.php class:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Application_Form_Guestbook <span class="kw2">extends</span> sfForm</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <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;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">setWidgets</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;email&#39;</span> <span class="sy0">=&gt;</span> <span class="kw2">new</span> sfWidgetFormInput<span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;label&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Your email address:&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;comment&#39;</span> <span class="sy0">=&gt;</span> <span class="kw2">new</span> sfWidgetFormTextarea<span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;label&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Please Comment:&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <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; <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">setValidators</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;email&#39;</span> <span class="sy0">=&gt;</span> <span class="kw2">new</span> sfValidatorEmail<span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;max_length&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">255</span><span class="sy0">,</span> <span class="st0">&#39;required&#39;</span> <span class="sy0">=&gt;</span> <span class="kw2">true</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; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;comment&#39;</span> <span class="sy0">=&gt;</span> <span class="kw2">new</span> sfValidatorString<span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;max_length&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">255</span><span class="sy0">,</span> <span class="st0">&#39;required&#39;</span> <span class="sy0">=&gt;</span> <span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h3>Step 4. - Add Form to Controller</h3>
<p>Now we add the form instantiation and processing code to the controller action. As you can see this is very similar as using the native Zend forms.</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> GuestbookController <span class="kw2">extends</span> Zend_Controller_Action</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> signAction<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="co1">// action body</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$form</span> <span class="sy0">=</span> <span class="kw2">new</span> Application_Form_Guestbook<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="kw1">if</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getRequest</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">isPost</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;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$form</span><span class="sy0">-&gt;</span><span class="me1">bind</span><span class="br0">&#40;</span><span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">getRequest</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">getPost</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; &nbsp; &nbsp; &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">$form</span><span class="sy0">-&gt;</span><span class="me1">isValid</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; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// get cleaned, valid form values</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$values</span> <span class="sy0">=</span> <span class="re1">$form</span><span class="sy0">-&gt;</span><span class="me1">getValues</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// map to model, etc&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re1">$this</span><span class="sy0">-&gt;</span>_helper<span class="sy0">-&gt;</span><span class="me1">redirector</span><span class="br0">&#40;</span><span class="st0">&#39;index&#39;</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; &nbsp; &nbsp; </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">view</span><span class="sy0">-&gt;</span><span class="me1">form</span> <span class="sy0">=</span> <span class="re1">$form</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>
<h3>Step 5. - Add Form to View</h3>
<p>Finally, we add the form rendering to the sign.phtml file:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>form action<span class="sy0">=</span><span class="st0">&quot;&lt;?php echo $this-&gt;url(); ?&gt;&quot;</span> method<span class="sy0">=</span><span class="st0">&quot;post&quot;</span><span class="sy0">&gt;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">&lt;</span>table<span class="sy0">&gt;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">&lt;?php</span> <span class="kw3">echo</span> <span class="re1">$this</span><span class="sy0">-&gt;</span><span class="me1">form</span><span class="sy0">;</span> <span class="kw2">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">&lt;/</span>table<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sy0">&lt;</span>input type<span class="sy0">=</span><span class="st0">&quot;submit&quot;</span> value<span class="sy0">=</span><span class="st0">&quot;Save&quot;</span> <span class="sy0">/&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;/</span>form<span class="sy0">&gt;</span></div>
</li>
</ol>
</div>
<p>As you can see, getting sfForms to work in Zend is pretty easy once everything is set up. Now you can take advantage of the many neat things you can do with symfony forms.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lampjunkie.com/2010/06/using-symfony-sfforms-in-a-zend-application/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Wishing that PHP had something like JAXB</title>
		<link>http://www.lampjunkie.com/2010/05/wishing-that-php-had-something-like-jaxb/</link>
		<comments>http://www.lampjunkie.com/2010/05/wishing-that-php-had-something-like-jaxb/#comments</comments>
		<pubDate>Sun, 09 May 2010 09:48:56 +0000</pubDate>
		<dc:creator>marc</dc:creator>
		
		<category><![CDATA[Featured]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.lampjunkie.com/?p=43</guid>
		<description><![CDATA[Lately I have been doing alot of Java development especially in regards to web service development and consumption. One of the tools that I have relied on heavily is the JAXB project to consume and create XML feeds. This has been a godsend and made my life easy when parsing and creating XML. By just [...]]]></description>
			<content:encoded><![CDATA[<p>Lately I have been doing alot of Java development especially in regards to web service development and consumption. One of the tools that I have relied on heavily is the <a href="https://jaxb.dev.java.net/">JAXB</a> project to consume and create XML feeds. This has been a godsend and made my life easy when parsing and creating XML. By just using a small amount of code and annotations parsing XML is a breeze.</p>
<p>After using JAXB for awhile, it got me thinking&#8230;.why doesn&#8217;t PHP have something like this&#8230;how hard would it be to create? On the PHP side of things I have been in love with <a href="http://php.net/manual/en/book.simplexml.php">SimpleXML</a> since I first started using it a number of years ago. Just like the name implies, it is relatively simple. But, could something be developed that would be even simpler like JAXB?</p>
<p>The thing that really makes parsing XML with JAXB easy is the ability to use annotations to map classes and properties to XML nodes. Of course PHP doesn&#8217;t have built-in support for annotations, but this can be achieved by using the Extended Reflection API or using a project built on top of that such as <a href="http://code.google.com/p/addendum/">addendum</a>. It would also be possible to create a PHP extension to handle this in a much more efficient manner.</p>
<p>This is how I envision being able to parse (unmarshal) XML to a PHP object graph:</p>
<p>Given the following sample XML:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;result<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;ads<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;ad</span> <span class="re0">url</span>=<span class="st0">&quot;http://ad1-url&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;title<span class="re2">&gt;</span></span></span>My Title<span class="sc3"><span class="re1">&lt;/title<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;description<span class="re2">&gt;</span></span></span>Some Description<span class="sc3"><span class="re1">&lt;/description<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;/ad<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;ad</span> <span class="re0">url</span>=<span class="st0">&quot;http://ad2-url&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;title<span class="re2">&gt;</span></span></span>My Title<span class="sc3"><span class="re1">&lt;/title<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;description<span class="re2">&gt;</span></span></span>Some Description<span class="sc3"><span class="re1">&lt;/description<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;/ad<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;/ads<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/result<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>Convert to an object graph like this:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @XmlRoot(name=&quot;result&quot;)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Result <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * @XmlCollection(name=&quot;ads&quot;)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * @var array</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="re1">$ads</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// getters/setters</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* @XmlElement(name=&quot;ad&quot;)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Ad <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * @XmlAttribute(name=&quot;url&quot;)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * @var string</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="re1">$url</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * @XmlElement(name=&quot;title&quot;)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * @var string</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="re1">$title</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * @XmlElement(name=&quot;description&quot;)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * @var string</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="re1">$description</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// getters/setters</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// grab an XML feed</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$xml</span> <span class="sy0">=</span> <span class="kw3">file_get_contents</span><span class="br0">&#40;</span><span class="st0">&#39;some-xml-from-somewhere.xml&#39;</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="co1">// create our unmarshaller and tell it where to find classes to unmarshal to</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$unmarhaller</span> <span class="sy0">=</span> <span class="kw2">new</span> SimplerXmlUnmarshaller<span class="br0">&#40;</span><span class="st0">&quot;/package/location&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="co1">// unmarshal to an object graph</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$result</span> <span class="sy0">=</span> <span class="re1">$unmarshaller</span><span class="sy0">-&gt;</span><span class="me1">unmarshal</span><span class="br0">&#40;</span><span class="re1">$xml</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="co1">// loop through objects</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$result</span><span class="sy0">-&gt;</span><span class="me1">getAds</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">as</span> <span class="re1">$ad</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">echo</span> <span class="re1">$ad</span><span class="sy0">-&gt;</span><span class="me1">getUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&#39;&lt;br /&gt;&#39;</span> <span class="sy0">.</span> <span class="re1">$ad</span><span class="sy0">-&gt;</span><span class="me1">getTitle</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&#39;&lt;br /&gt;&#39;</span> <span class="sy0">.</span> <span class="re1">$ad</span><span class="sy0">-&gt;</span><span class="me1">getDescription</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&#39;&lt;br /&gt;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Hopefully in the near future I will get time to develop a proof of concept to see if this works and take it from there&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lampjunkie.com/2010/05/wishing-that-php-had-something-like-jaxb/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHP SoapClient and Polymorphic Service Objects</title>
		<link>http://www.lampjunkie.com/2010/04/php-soapclient-and-polymorphic-service-objects/</link>
		<comments>http://www.lampjunkie.com/2010/04/php-soapclient-and-polymorphic-service-objects/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 18:48:15 +0000</pubDate>
		<dc:creator>marc</dc:creator>
		
		<category><![CDATA[Featured]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[soap]]></category>

		<guid isPermaLink="false">http://www.lampjunkie.com/?p=41</guid>
		<description><![CDATA[There may be a time when you need to deal with passing polymorphic objects back and forth between PHP&#8217;s SoapClient and a SOAP web service. Things are nice and easy (work as expected) when you are retrieving these objects from a service. But, when it comes time to pass these objects back&#8230;well&#8230;it&#8217;s not as simple [...]]]></description>
			<content:encoded><![CDATA[<p>There may be a time when you need to deal with passing polymorphic objects back and forth between PHP&#8217;s SoapClient and a SOAP web service. Things are nice and easy (work as expected) when you are retrieving these objects from a service. But, when it comes time to pass these objects back&#8230;well&#8230;it&#8217;s not as simple as one would hope.</p>
<p>For the following examples, we are going to assume that we are connecting to a service that has methods that return and accept an abstract type named &#8220;Animal&#8221;. Animal can be an instance of Dog or Cat.</p>
<p>- Animal<br />
  &#8212; Dog<br />
  &#8212; Cat</p>
<p>Now let&#8217;s assume that there are two methods in the service:</p>
<p>getAnimalById(Long id)<br />
saveAnimal(Animal animal)</p>
<p>Here is a snippet of what the WSDL for these service methods and types would look like:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;xs:complexType</span> <span class="re0">name</span>=<span class="st0">&quot;getAnimalById&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;xs:sequence<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;xs:element</span> <span class="re0">name</span>=<span class="st0">&quot;id&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;xs:long&quot;</span> <span class="re0">minOccurs</span>=<span class="st0">&quot;0&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;/xs:sequence<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/xs:complexType<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;xs:complexType</span> <span class="re0">name</span>=<span class="st0">&quot;getAnimalByIdResponse&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;xs:sequence<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;xs:element</span> <span class="re0">name</span>=<span class="st0">&quot;return&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;ns1:Animal&quot;</span> <span class="re0">minOccurs</span>=<span class="st0">&quot;0&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;/xs:sequence<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/xs:complexType<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;xs:complexType</span> <span class="re0">name</span>=<span class="st0">&quot;saveAnimal&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;xs:sequence<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;xs:element</span> <span class="re0">name</span>=<span class="st0">&quot;animal&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;ns1:Animal&quot;</span> <span class="re0">minOccurs</span>=<span class="st0">&quot;0&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;/xs:sequence<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/xs:complexType<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;xs:complexType</span> <span class="re0">name</span>=<span class="st0">&quot;saveAnimalResponse&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;xs:sequence</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/xs:complexType<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;xs:complexType</span> <span class="re0">name</span>=<span class="st0">&quot;Animal&quot;</span> <span class="re0">abstract</span>=<span class="st0">&quot;true&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;xs:sequence</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/xs:complexType<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;xs:complexType</span> <span class="re0">name</span>=<span class="st0">&quot;Dog&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;xs:complexContent<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;xs:extension</span> <span class="re0">base</span>=<span class="st0">&quot;tns:Animal&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;xs:sequence</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;/xs:extension<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;/xs:complexContent<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/xs:complexType<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;xs:complexType</span> <span class="re0">name</span>=<span class="st0">&quot;Cat&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;xs:complexContent<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;xs:extension</span> <span class="re0">base</span>=<span class="st0">&quot;tns:Animal&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;xs:sequence</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;/xs:extension<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;/xs:complexContent<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/xs:complexType<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>Now, using this information we are going to write our PHP classes which map to these service types:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">abstract <span class="kw2">class</span> Animal <span class="br0">&#123;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Dog <span class="kw2">extends</span> Animal <span class="br0">&#123;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Cat <span class="kw2">extends</span> Animal <span class="br0">&#123;</span><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Now, we will test out calling the service to try and get one of these implementing types:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// define our service to client class mapping</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$classMap</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;Animal&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Animal&#39;</span><span class="sy0">,</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;Dog&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Dog&#39;</span><span class="sy0">,</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#39;Cat&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;Cat&#39;</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="co1">// create client with classmap</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$client</span> <span class="sy0">=</span> <span class="kw2">new</span> SoapClient<span class="br0">&#40;</span><span class="st0">&quot;http://my-service-url:8080/AnimalService?wsdl&quot;</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;classmap&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$classMap</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// get an animal</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$result</span> <span class="sy0">=</span> <span class="re1">$client</span><span class="sy0">-&gt;</span><span class="me1">getAnimalById</span><span class="br0">&#40;</span><span class="nu0">1</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="co1">// what did we get?</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">var_dump</span><span class="br0">&#40;</span><span class="re1">$result</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Assuming that id:1 is supposed to return a Dog, we will see that this works as expected when the previous code is run:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">object<span class="br0">&#40;</span>stdClass<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">42</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="st0">&#39;return&#39;</span> <span class="sy0">=&gt;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; object<span class="br0">&#40;</span>Dog<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">43</span><span class="br0">&#93;</span></div>
</li>
</ol>
</div>
<p>Now, we will see how passing a Cat object to the saveAnimal() method doesn&#8217;t work as expected:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// meow!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$cat</span> <span class="sy0">=</span> <span class="kw2">new</span> Cat<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="co1">// oh-oh!!!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$client</span><span class="sy0">-&gt;</span><span class="me1">saveAnimal</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;animal&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$cat</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Chances are that the service will return some sort of SoapFault exception like &#8220;Unable to create an instance of Animal&#8230;&#8221;.</p>
<p>The problem here is that by default PHP&#8217;s SoapClient does not automatically take the implementing Cat object and pass it to the service as a Cat. Instead, it only sees that saveAnimal() is expecting an Animal type, so that&#8217;s what it gives it. Luckily, there is a solution to this problem with a little extra code.</p>
<p>The solution is to manually create a SoapVar object to wrap around the object that we are trying to pass into the service method. The important things here are that you need pass it the object, the name of the concrete class (Cat), and the namespace that the Cat type belongs to within the WSDL service definition. </p>
<p>Here&#8217;s what the revised code may look like:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// meow!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$cat</span> <span class="sy0">=</span> <span class="kw2">new</span> Cat<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="co1">// create our SoapVar wrapper</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$catSoapVar</span> <span class="sy0">=</span> <span class="kw2">new</span> SoapVar<span class="br0">&#40;</span><span class="re1">$cat</span><span class="sy0">,</span> <span class="co1">// the object to wrap</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SOAP_ENC_OBJECT<span class="sy0">,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">get_class</span><span class="br0">&#40;</span><span class="re1">$cat</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="co1">// the concrete class name</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;http://animals.lampjunkie.com&#39;</span> <span class="co1">// namespace that Animal, Dog, Cat belong to (in WSDL)</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// purr&#8230;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$client</span><span class="sy0">-&gt;</span><span class="me1">saveAnimal</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;animal&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$catSoapVar</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.lampjunkie.com/2010/04/php-soapclient-and-polymorphic-service-objects/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Get PHP SoapClient to speak with Java&#8217;s JAX-WS</title>
		<link>http://www.lampjunkie.com/2010/03/get-phps-soapclient-to-speak-with-javas-jax-ws/</link>
		<comments>http://www.lampjunkie.com/2010/03/get-phps-soapclient-to-speak-with-javas-jax-ws/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 07:32:25 +0000</pubDate>
		<dc:creator>marc</dc:creator>
		
		<category><![CDATA[Featured]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[soap]]></category>

		<guid isPermaLink="false">http://www.lampjunkie.com/?p=40</guid>
		<description><![CDATA[When delving into the magical world of trying to get a PHP SoapClient to consume a Java JAX-WS web service, there may be a few unexpected surprises that pop up. If you have been using SoapClient to communicate with other PHP SoapServer service, things are pretty straightforward. However, things get slightly more complicated when trying [...]]]></description>
			<content:encoded><![CDATA[<p>When delving into the magical world of trying to get a PHP SoapClient to consume a Java JAX-WS web service, there may be a few unexpected surprises that pop up. If you have been using SoapClient to communicate with other PHP SoapServer service, things are pretty straightforward. However, things get slightly more complicated when trying to call Java based JAX-WS services. Luckily, there are some simple solutions to make it a breeze to get these two to communicate seamlessly.</p>
<h3>The Request Problem</h3>
<p>When you first try to consume a Java JAX-WS web service, chances are that you try to call a method on that service using something like the following:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$client</span> <span class="sy0">=</span> <span class="kw2">new</span> SoapClient<span class="br0">&#40;</span><span class="st0">&quot;http://some-service-url:8080/MyService?wsdl&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$sum</span> <span class="sy0">=</span> <span class="re1">$client</span><span class="sy0">-&gt;</span><span class="me1">add</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>As you soon discover, this throws a SoapFault error such as the following:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">Fatal error<span class="sy0">:</span> Uncaught SoapFault exception<span class="sy0">:</span> <span class="br0">&#91;</span>S<span class="sy0">:</span>Server<span class="br0">&#93;</span> java<span class="sy0">.</span>lang<span class="sy0">.</span>NullPointerException <span class="sy0">&#8230;..</span> etc<span class="sy0">&#8230;</span></div>
</li>
</ol>
</div>
<p>Basically the problem is that JAX-WS is never getting the method parameters that we are trying to send over&#8230;</p>
<h3>The Solution</h3>
<p>Unlike calling another PHP SoapServer web service which will work flawlessly with unnamed parameters, JAX-WS is expecting just a little more. If we take a look at the WSDL for this service method, we see the following:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;message</span> <span class="re0">name</span>=<span class="st0">&quot;add&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;part</span> <span class="re0">name</span>=<span class="st0">&quot;parameters&quot;</span> <span class="re0">element</span>=<span class="st0">&quot;tns:add&quot;</span><span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/message<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;xs:complexType</span> <span class="re0">name</span>=<span class="st0">&quot;add&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xs:sequence<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xs:element</span> <span class="re0">name</span>=<span class="st0">&quot;a&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;xs:int&quot;</span> <span class="re0">minOccurs</span>=<span class="st0">&quot;0&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;xs:element</span> <span class="re0">name</span>=<span class="st0">&quot;b&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;xs:int&quot;</span> <span class="re0">minOccurs</span>=<span class="st0">&quot;0&quot;</span><span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xs:sequence<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/xs:complexType<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>So, what we see here is basically that the add() method is expecting an &quot;add&quot; request object. What we need to do is wrap our parameters into a request object so that JAX-WS will know how those parameters are mapped to the parameters it is expecting. This can easily be achieved by using PHP&#8217;s handy stdClass. So now our code becomes:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$addRequest</span> <span class="sy0">=</span> <span class="kw2">new</span> stdClass<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">$addRequest</span><span class="sy0">-&gt;</span><span class="me1">a</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$addRequest</span><span class="sy0">-&gt;</span><span class="me1">b</span> <span class="sy0">=</span> <span class="nu0">2</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$response</span> <span class="sy0">=</span> <span class="re1">$client</span><span class="sy0">-&gt;</span><span class="me1">add</span><span class="br0">&#40;</span><span class="re1">$addRequest</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>However, we can simplify this even more by using an associative array for the parameters. SoapClient will automatically know to translate an associative array into a complex type for the web service. So now we can do this:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$sum</span> <span class="sy0">=</span> <span class="re1">$client</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;a&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">1</span><span class="sy0">,</span> <span class="st0">&#39;b&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>Sweet! That&#8217;s much simpler, plus now it&#8217;s clear what each of the parameters are!</p>
<p>The Response Problem</p>
<p>Soon you will discover that this web service is not returning what you expected. Looking at the example, you would expect that the service simply returns an integer with the value 3. Sadly, it&#8217;s not that simple. The JAX-WS services will always pass back a response object for each method. By examining the response in the WSDL, we can see exactly what is happening:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;xs:complexType</span> <span class="re0">name</span>=<span class="st0">&quot;addResponse&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xs:sequence<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xs:element</span> <span class="re0">name</span>=<span class="st0">&quot;return&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;xs:int&quot;</span> <span class="re0">minOccurs</span>=<span class="st0">&quot;0&quot;</span><span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xs:sequence<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/xs:complexType<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>So, the add() method is returning an addResponse object. Since we have not defined any class mapping for our SoapClient, this response simply gets returned as a stdClass object with a single property named &quot;return&quot;. With this knowledge, we can now see that we need to access the response like this:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$addResponse</span> <span class="sy0">=</span> <span class="re1">$client</span><span class="sy0">-&gt;</span><span class="me1">add</span><span class="br0">&#40;</span><span class="re1">$addRequest</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$sum</span> <span class="sy0">=</span> <span class="re1">$addResponse</span><span class="sy0">-&gt;</span><span class="me1">result</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<h3>The Ultimate Response Solution</h3>
<p>While the response example above shows a solution to getting the correct response, it isn&#8217;t necessarily the most elegant. When calling a service method and getting the result, it would be nice to automatically have the value you are expecting instead of having to add one more step of grabbing the final result from an object.</p>
<p>Luckily this can be easily achieved by extending the SoapClient class and tinkering it just a little bit. We are going to simply extend the class, overload the __call magic method, and do our response parsing in there.</p>
<p>So, here we create our new JAX-WS specific SoapClient class:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> JaxWsSoapClient <span class="kw2">extends</span> SoapClient</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">$arguments</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re1">$response</span> <span class="sy0">=</span> parent<span class="sy0">::</span>__call<span class="br0">&#40;</span><span class="re1">$method</span><span class="sy0">,</span> <span class="re1">$arguments</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">return</span> <span class="re1">$response</span><span class="sy0">-&gt;</span><span class="me1">return</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Now, we can do this:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$client</span> <span class="sy0">=</span> <span class="kw2">new</span> JaxWsSoapClient<span class="br0">&#40;</span><span class="st0">&quot;http://some-service-url:8080/MyService?wsdl&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$sum</span> <span class="sy0">=</span> <span class="re1">$client</span><span class="sy0">-&gt;</span><span class="me1">add</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;a&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">1</span><span class="sy0">,</span> <span class="st0">&#39;b&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.lampjunkie.com/2010/03/get-phps-soapclient-to-speak-with-javas-jax-ws/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Writing Custom PHP Extensions to Speed Up Applications</title>
		<link>http://www.lampjunkie.com/2010/01/writing-custom-php-extensions-to-speed-up-applications/</link>
		<comments>http://www.lampjunkie.com/2010/01/writing-custom-php-extensions-to-speed-up-applications/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 00:20:50 +0000</pubDate>
		<dc:creator>marc</dc:creator>
		
		<category><![CDATA[Featured]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[php-extensions]]></category>

		<guid isPermaLink="false">http://www.lampjunkie.com/?p=45</guid>
		<description><![CDATA[Sometimes you may come across a situation where a core piece of your PHP is doing some sort of intensive algorithm or something else which is just taking way to long.
Recently I had this problem with an application which I was developing. Essentially I was redesigning an existing application that needed to be able to [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes you may come across a situation where a core piece of your PHP is doing some sort of intensive algorithm or something else which is just taking way to long.</p>
<p>Recently I had this problem with an application which I was developing. Essentially I was redesigning an existing application that needed to be able to handle millions of requests every day. Inside of the original application was a core utility class that needed to encrypt query string parameters using a key based caesar cipher. The existing code was as optimized as it could be within PHP, but there were serious issues when we needed to encrypt 10+ links per page view. The average time was somewhere in the range of ~300ms just to run the encryption. Inside the encryption method was a loop that went through each character of a query string to convert it to it&#8217;s ASCII code and rotate those codes to perform the encryption.</p>
<p>This was one of those times when PHP really showed it&#8217;s weaknesses for intense &#8220;calculations&#8221;. After thinking about the problem for awhile, I decided to first convert the encryption/decryption methods to C++ and just use PHP&#8217;s exec() function to call the compiled C++ code. This worked, but just felt a little too weird&#8230;</p>
<p>After thinking about the problem some more, it hit me&#8230;how about I just convert the program to a custom PHP Extension! So then the journey of trying to find documentation and tutorials on how to do this began. After a few days I was able to write an extension and install it within PHP. Basically I designed the extension so that it exposed those encryption/decryption methods within a static class that can be used from any application on the server. The final results were that it took less than 1ms to encrypt all the querystrings in one shot. Much better!</p>
<p>Using this new found knowledge I was able to take another core class which used PHP&#8217;s Extended Reflection API to parse annotations within the docblocks of database model classes to map them to their respective tables and columns.</p>
<p>Once you understand how to use the Zend Engine&#8217;s internal API to build your custom extensions, the possibilities are endless. At that point it&#8217;s a trivial matter to convert your PHP code to C and compile your extension. But, figuring out where to find tutorials, etc on how to do this is the biggest hurdle to get over.</p>
<p>Here are some resources to get you started in the right direction:</p>
<ul>
<li><a href="http://devzone.zend.com/article/1021">Zend&#8217;s Extension Writing Tutorial</a></li>
<li><a href="http://talks.somabo.de/200505_cancun_implementing_php5_oop_extensions.pdf">Implementing PHP5 OOP Extensions</a></li>
<li><a href="http://talks.php.net/show/PECL_Gen">PECL_GEN</a></li>
<li><a href="http://www.tuxradar.com/practicalphp/20/0/0">Writing Extensions</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.lampjunkie.com/2010/01/writing-custom-php-extensions-to-speed-up-applications/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Custom Tasks in Symfony 1.1</title>
		<link>http://www.lampjunkie.com/2008/07/custom-tasks-in-symfony-11/</link>
		<comments>http://www.lampjunkie.com/2008/07/custom-tasks-in-symfony-11/#comments</comments>
		<pubDate>Tue, 15 Jul 2008 19:04:44 +0000</pubDate>
		<dc:creator>marc</dc:creator>
		
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.lampjunkie.com/?p=39</guid>
		<description><![CDATA[Awhile ago I wrote a post on how to create custom tasks in symfony 1.0. A reader posted a question on how to do this in symfony 1.1. At first I figured out a solution of how to do it manually, but then I discovered this tutorial on the symfony cookbook section: http://www.symfony-project.org/cookbook/1_1/en/tasks which describes [...]]]></description>
			<content:encoded><![CDATA[<p>Awhile ago I wrote a <a href="http://www.lampjunkie.com/2008/04/custom-tasks-in-symfony-10">post on how to create custom tasks in symfony 1.0</a>. A reader posted a question on how to do this in symfony 1.1. At first I figured out a solution of how to do it manually, but then I discovered this tutorial on the symfony cookbook section: <a href="http://www.symfony-project.org/cookbook/1_1/en/tasks">http://www.symfony-project.org/cookbook/1_1/en/tasks</a> which describes exactly how to do it!</p>
<p>As the tutorial describes, there is a new symfony task to help creating the skeleton classes for your own tasks! Sweet, it couldn&#8217;t be any simpler!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lampjunkie.com/2008/07/custom-tasks-in-symfony-11/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PuTTY with Tabs (PuTTY Connection Manager)</title>
		<link>http://www.lampjunkie.com/2008/05/putty-with-tabs-putty-connection-manager/</link>
		<comments>http://www.lampjunkie.com/2008/05/putty-with-tabs-putty-connection-manager/#comments</comments>
		<pubDate>Fri, 23 May 2008 22:52:44 +0000</pubDate>
		<dc:creator>marc</dc:creator>
		
		<category><![CDATA[Misc]]></category>

		<category><![CDATA[putty]]></category>

		<guid isPermaLink="false">http://www.lampjunkie.com/?p=38</guid>
		<description><![CDATA[Whenever I am using a Windows desktop and I need to connect to various servers via SSH, I use PuTTY. It&#8217;s lightweight and gets the job done without any problems. However, the one problem has always been that I may have 10 different instances open and it&#8217;s a pain in the ass to switch between [...]]]></description>
			<content:encoded><![CDATA[<p>Whenever I am using a Windows desktop and I need to connect to various servers via SSH, I use PuTTY. It&#8217;s lightweight and gets the job done without any problems. However, the one problem has always been that I may have 10 different instances open and it&#8217;s a pain in the ass to switch between them. </p>
<p>In the past I&#8217;ve tried to find other SSH clients for Windows that featured tabbing, but none of them were really quite what I was looking for. I tried <a href="http://en.poderosa.org/">Ponderosa</a>, which was pretty good, but ran into weird issues with the rendering when scrolling in Nano.</p>
<p>Now, today I received a message on a PHP mailing list about the <a href="http://puttycm.free.fr">PuTTY Connection Manager</a> which will manage multiple instances of PuTTY by giving you tabs! Yay!!!!</p>
<p>I encourage anyone who needs to use windows to connect to various servers to check it out:</p>
<p><a href="http://puttycm.free.fr">PuTTY Connection Manager</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lampjunkie.com/2008/05/putty-with-tabs-putty-connection-manager/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Store Symfony Sessions in Database with Propel</title>
		<link>http://www.lampjunkie.com/2008/05/store-symfony-sessions-in-database-with-propel/</link>
		<comments>http://www.lampjunkie.com/2008/05/store-symfony-sessions-in-database-with-propel/#comments</comments>
		<pubDate>Fri, 23 May 2008 17:17:21 +0000</pubDate>
		<dc:creator>marc</dc:creator>
		
		<category><![CDATA[Symfony]]></category>

		<category><![CDATA[propel]]></category>

		<category><![CDATA[sessions]]></category>

		<guid isPermaLink="false">http://www.lampjunkie.com/?p=37</guid>
		<description><![CDATA[Previously, I wrote a post on how to store user sessions in a database using Doctrine. I figured that I would follow it up by writing this article to demonstrate how to do the same thing using Propel. The steps are pretty much similar, but with some slight variations.
Step1 - Create your sessions table



&#160;


CREATE TABLE [...]]]></description>
			<content:encoded><![CDATA[<p>Previously, I wrote a <a href="http://www.lampjunkie.com/2008/05/store-symfony-sessions-in-database-with-doctrine/">post on how to store user sessions in a database using Doctrine</a>. I figured that I would follow it up by writing this article to demonstrate how to do the same thing using Propel. The steps are pretty much similar, but with some slight variations.</p>
<h3>Step1 - Create your sessions table</h3>
<div class="geshi no sql">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="kw1">IF</span> <span class="kw1">NOT</span> <span class="kw1">EXISTS</span> <span class="st0">`sessions`</span> <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`sess_id`</span> varchar<span class="br0">&#40;</span><span class="nu0">64</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`sess_data`</span> text <span class="kw1">NOT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">`sess_time`</span> int<span class="br0">&#40;</span><span class="nu0">11</span><span class="br0">&#41;</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span>,</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">KEY</span> <span class="st0">`sess_id`</span> <span class="br0">&#40;</span><span class="st0">`sess_id`</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span> ENGINE<span class="sy0">=</span>MyISAM <span class="kw1">DEFAULT</span> CHARSET<span class="sy0">=</span>latin1;</div>
</li>
</ol>
</div>
<h3>Step 2 - Edit /config/databases.yml</h3>
<p>You need to make sure that you have a connection set up for the session database. So edit /config/databases.yml so it has something like the following:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1">all:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; sessions_db:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; class: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sfPropelDatabase</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; param:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; dsn: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mysql://my_user:my_password@localhost/my_sessions_db</div>
</li>
</ol>
</div>
<h3>Step 3 - Edit the app/config/factories.yml</h3>
<p>You will need to let symfony know that you are going to be using the sfMySQLSessionStorage class to handle your session storage, so edit /app/config/factories.yml:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1">&nbsp; storage:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; class: sfMySQLSessionStorage</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; param:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; db_table: sessions &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Name of the table storing the sessions</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; database: sessions_db &nbsp; &nbsp; # Name of the database connection to use</div>
</li>
</ol>
</div>
<p>Finally, make sure to clear your cache and you should be all set!</p>
<h3>Step 4 - Configure symfony session cleanup, etc.</h3>
<p>Andy, from <a href="http://blog.t8d.de">blog.t8d.de</a> posted some additional findings and links on their blog about some settings that you will want to change within symfony and your php.ini to make sure that your application is performing the proper session cleanup.</p>
<p>Check out:</p>
<ol>
<li><a href="http://robrosenbaum.com/php/howto-disable-session-timeout-in-symfony/">http://robrosenbaum.com/php/howto-disable-session-timeout-in-symfony/</a></li>
<li><a href="http://redotheweb.com/2008/02/01/database-session-handling-and-garbage-collector/">http://redotheweb.com/2008/02/01/database-session-handling-and-garbage-collector/</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.lampjunkie.com/2008/05/store-symfony-sessions-in-database-with-propel/feed/</wfw:commentRss>
		</item>
		<item>
		<title>You know your Website is soooo Web 1.0 When&#8230;</title>
		<link>http://www.lampjunkie.com/2008/05/you-know-your-website-is-sooo-web-1-0-when/</link>
		<comments>http://www.lampjunkie.com/2008/05/you-know-your-website-is-sooo-web-1-0-when/#comments</comments>
		<pubDate>Tue, 20 May 2008 23:33:43 +0000</pubDate>
		<dc:creator>marc</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.lampjunkie.com/?p=35</guid>
		<description><![CDATA[We all have seen them&#8230;those websites that are still caught somewhere in the year 1999 - 2002. Here&#8217;s a checklist to make sure your site isn&#8217;t stuck in Web 1.0 world  
1. Your website&#8217;s pages end in any of the following: .asp, .php3, .php4
2. You have a 30 second Flash Splash Page.
3. You have [...]]]></description>
			<content:encoded><![CDATA[<p>We all have seen them&#8230;those websites that are still caught somewhere in the year 1999 - 2002. Here&#8217;s a checklist to make sure your site isn&#8217;t stuck in Web 1.0 world <img src='http://www.lampjunkie.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>1. Your website&#8217;s pages end in any of the following: .asp, .php3, .php4</p>
<p>2. You have a 30 second Flash Splash Page.</p>
<p>3. You have an all flash site that displays in a popup window.</p>
<p>4. There are only 20+ tables on each page, not one div&#8230;oh and no CSS.</p>
<p>5. You only know how to make a two column layout with frames.</p>
<p>6. Your site says &#8220;Best viewed with Internet Explorer 5.0&#8243; somewhere on it and you really mean it.</p>
<p>7. The closest thing to AJAX is that text in the &lt;blink&gt; or &lt;marquee&gt; tags.</p>
<p>8. Trying to find the site in Google yields nothing since all of your pages contain a single image encompassing your layout and all content.</p>
<p>9. Your streaming video is that animated GIF on your home page.</p>
<p>10. Your idea of social networking is that guestbook CGI script.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lampjunkie.com/2008/05/you-know-your-website-is-sooo-web-1-0-when/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Remove CVS or .svn Directories from the Linux Command Line</title>
		<link>http://www.lampjunkie.com/2008/05/remove-cvs-or-svn-directories-from-the-linux-command-line/</link>
		<comments>http://www.lampjunkie.com/2008/05/remove-cvs-or-svn-directories-from-the-linux-command-line/#comments</comments>
		<pubDate>Mon, 19 May 2008 03:57:16 +0000</pubDate>
		<dc:creator>marc</dc:creator>
		
		<category><![CDATA[Subversion]]></category>

		<category><![CDATA[cvs]]></category>

		<guid isPermaLink="false">http://www.lampjunkie.com/?p=34</guid>
		<description><![CDATA[
So, you copied a bunch of directories from one source controlled project to another and you don&#8217;t want to go through and delete all those CVS or .svn directories by hand? Ok, no problem&#8230;
Below are two snippets that will show you how to recursively remove those directories from the Linux command line in one quick [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.lampjunkie.com/wp-content/themes/mimbo2.1/images/posts/remove-cvs-svn.jpg" alt="Remove CVS or SVN (subversion) directories recursively through command line" class="picleft" /></p>
<p>So, you copied a bunch of directories from one source controlled project to another and you don&#8217;t want to go through and delete all those CVS or .svn directories by hand? Ok, no problem&#8230;</p>
<p>Below are two snippets that will show you how to recursively remove those directories from the Linux command line in one quick instant. Just be sure that if you click-paste these into your shell window, that you are already in the top directory off where you want to delete stuff. I&#8217;ve made the mistake of doing it in the wrong folder without thinking and it automatically deleted all my CVS files for an entire project!</p>
<h3>For CVS:</h3>
<div class="geshi no shell">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">find . -name CVS -prune -exec rm -rf {} \;</div>
</li>
</ol>
</div>
<h3>For SVN:</h3>
<div class="geshi no shell">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">find . -name .svn -prune -exec rm -rf {} \;</div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.lampjunkie.com/2008/05/remove-cvs-or-svn-directories-from-the-linux-command-line/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
  
