<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
  <title>A Clean, Well-Lighted Place - Home</title>
  <id>tag:blog.codingspree.net,2009:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.8.0">Mephisto Drax</generator>
  
  <link href="http://blog.codingspree.net/" rel="alternate" type="text/html" />
  <updated>2009-11-04T15:50:11Z</updated>
  <link rel="self" href="http://feeds.feedburner.com/codingspreeblog" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2009-11-04:754</id>
    <published>2009-11-04T15:43:00Z</published>
    <updated>2009-11-04T15:50:11Z</updated>
    <category term="symfony" />
    <link href="http://blog.codingspree.net/2009/11/4/book-symfony-1-3-web-application-development" rel="alternate" type="text/html" />
    <title>Book: Symfony 1.3 Web Application Development</title>
<content type="html">
            &lt;p&gt;Few weeks ago &lt;a href="http://www.packtpub.com/"&gt;Packt Publishing&lt;/a&gt; sent me their new book called &lt;a href="http://www.packtpub.com/symfony-1-3-web-application-development"&gt;Symfony 1.3 Web Application Development&lt;/a&gt; to review. Ironically (or not) I'm not doing any active symfony development in the last few months, but I'm trying to be up to date with the news around symfony.&lt;p&gt;

&lt;p&gt;As title says the book is based on the upcoming &lt;a href="http://www.symfony-project.org/installation/1_3"&gt;1.3&lt;/a&gt; version of the framework. While building an application called &lt;strong&gt;The Milkshake Shop&lt;/strong&gt; readers are introduced to the features that the framework can offer including some of the latest (and may a little bit not so good documented) ones like forms, routes, creating and packaging plugins and so on. There is also a whole chapter dedicated to performance and optimization. Full table of contents can be found &lt;a href="http://www.packtpub.com/article/symfony-1-3-web-application-development-table-of-contents"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It was a surprise (at lest for me) to see that the ORM choosen for The Milkshake Shop (and the book) was &lt;a href="http://propel.phpdb.org/trac/"&gt;Propel&lt;/a&gt; instead of &lt;a href="http://www.doctrine-project.org/"&gt;Doctrine&lt;/a&gt; which was choosen as the default ORM framework.&lt;/p&gt;

&lt;p&gt;However this book is a good foundation for everyone that's new to symfony world and also gives some more information about the features introduced in both 1.2 and 1.3 to the developers which are still doing their job using 1.0 version.&lt;/p&gt;

&lt;p&gt;At the end the one thing that I didn't like in this book - 
&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"Test-driven development is the key to bug-free and well-written code. Symfony provides the ability for unit and functional testing. Unit tests enable the developer to test functions and methods for input and output. While functionality tests helps the developer to test for functional issues that would be executed in the browser, Symfony has its own testing framework called Lime. This testing framework is useful for both unit testing and functional testing. All test output can be saved in the xUnit format."&lt;/em&gt; - 
&lt;br /&gt;&lt;br /&gt;Believe it or not, but that's the only place where testing is mentioned (correct me of I'm wrong)! Seriously, if &lt;strong&gt;"Test-driven development is the key to bug-free and well-written code"&lt;/strong&gt; give it a chapter or two. Or even better, build the whole app in a test-driven way.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2009-09-21:746</id>
    <published>2009-09-21T14:54:00Z</published>
    <updated>2009-09-21T15:48:51Z</updated>
    <category term="rails" />
    <link href="http://blog.codingspree.net/2009/9/21/rails-developer-best-friends" rel="alternate" type="text/html" />
    <title>Rails developer best friends</title>
<content type="html">
            As you may already know (but, frankly, I don't see how) a month ago  I've changed my job. Yes, I'm not any more employee of &lt;a href="http://netage.bg"&gt;Netage.bg&lt;/a&gt; and I'm not any more full time PHP developer. In fact now I'm not even a part time PHP developer.
&lt;br /&gt;&lt;br /&gt;
Currently I'm involved in a project named &lt;a href="http://meetpips.com"&gt;MeetPips.com&lt;/a&gt; which is part of &lt;a href="http://www.pipsalacarte.com/"&gt;group of sites&lt;/a&gt;, all related to Forex market.
&lt;br /&gt;&lt;br /&gt;
Although I'm in the Rails hype since 2006 or something this is my first full time Rails job and even more - it's a telecommute job, so let me share some of the tools that makes the life of a Rails developer happier.
&lt;br /&gt;&lt;br /&gt;

&lt;a href="http://www.vim.org/"&gt;Vim&lt;/a&gt; - that was may be the biggest change for me. During the years  I was playing with all Rails related IDEs - as an Eclipse user I first tried &lt;a href="http://aptana.com/"&gt;Aptana&lt;/a&gt;, then switched to &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; and finally I was playing with &lt;a href="http://www.jetbrains.com/ruby/index.html"&gt;RubyMine&lt;/a&gt;. All these are not bad IDEs, but there was always something that I didn't liked, meanwhile I was always frustrated when trying to switch to Vim with all these plugins, mappings and the other .vimrc magic. One day I found &lt;a href="http://github.com/jferris/config_files"&gt;http://github.com/jferris/config_files&lt;/a&gt; and everything came to its place.

&lt;br /&gt;&lt;br /&gt;
&lt;a href="http://rspec.info"&gt;RSpec&lt;/a&gt; and &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt; - Both specs and features are in great help when you have to jump in new and unknown code base - if you don't know what's this or what is it doing - read the specs. If there are not any - write some.

&lt;br /&gt;&lt;br /&gt;
&lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; - the better version control system. Especially if you are working telecommute and your co-workers are all over the world. And of course &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;.

&lt;br /&gt;&lt;br /&gt;
&lt;a href="http://pivotallabs.com/users/chad/blog/articles/366-ruby-debug-in-30-seconds-we-don-t-need-no-stinkin-gui-"&gt;rdebug&lt;/a&gt; - helps you see what's going on inside your code.

&lt;br /&gt;&lt;br /&gt;
&lt;a href="http://www.hoptoadapp.com/"&gt;Hoptoad&lt;/a&gt; - users are known to be the best bug finders, but not many of them report these bug. Hoptoad will do this for you.

&lt;br /&gt;&lt;br /&gt;
&lt;a href="http://www.engineyard.com/cloud-services/solo"&gt;Engine Yard Solo&lt;/a&gt; - Rails hosting without pain.

&lt;br /&gt;&lt;br /&gt;
&lt;a href="http://www.newrelic.com/"&gt;NewRelic&lt;/a&gt; - application performance monitoring.

&lt;br /&gt;&lt;br /&gt;
That's all, folks.
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2009-07-22:739</id>
    <published>2009-07-22T12:07:00Z</published>
    <updated>2009-07-22T12:08:11Z</updated>
    <category term="rails" />
    <link href="http://blog.codingspree.net/2009/7/22/rails-underground-london-july-24-25-2009" rel="alternate" type="text/html" />
    <title>Rails Underground, London, July 24-25 2009</title>
<content type="html">
            &lt;a href="http://www.rails-underground.com" title="I'm attending Rails Underground!"&gt;&lt;/a&gt;
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2009-04-16:735</id>
    <published>2009-04-16T13:22:00Z</published>
    <updated>2009-04-16T13:25:08Z</updated>
    <category term="hoptoad" />
    <category term="sfhoptoadnotifierplugin" />
    <category term="symfony" />
    <link href="http://blog.codingspree.net/2009/4/16/sfhoptoadnotifierplugin-track-your-symfony-project-exceptions-using-hoptoad" rel="alternate" type="text/html" />
    <title>sfHoptoadNotifierPlugin - track your symfony project exceptions using Hoptoad</title>
<content type="html">
            &lt;a href="http://www.symfony-project.org/plugins/sfHoptoadNotifierPlugin"&gt;sfHoptoadNotifier&lt;/a&gt; is symfony plugin that sends notifications to &lt;a href="http://hoptoadapp.com"&gt;Hoptoad&lt;/a&gt;  about your project 
exceptions. It's based on &lt;a href="http://github.com/rich/php-hoptoad-notifier/tree/master"&gt;rich/php-hoptoad-notifier&lt;/a&gt;. 
You can check &lt;a href="http://github.com/rich/php-hoptoad-notifier/tree/master"&gt;it's README&lt;/a&gt; for more info.
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Requirements&lt;/strong&gt;&lt;br /&gt;
&lt;a href="http://github.com/rich/php-hoptoad-notifier/tree/master"&gt;rich/php-hoptoad-notifier&lt;/a&gt; uses the Horde_Yaml class. You can install this class using the commands below.
&lt;div class="CodeMacro"&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;$ pear channel-discover pear.horde.org&lt;tt&gt;
&lt;/tt&gt;$ pear install horde/yaml&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


It also uses Pear's HTTP_Request:
&lt;div class="CodeMacro"&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;$ pear install HTTP_Request      &lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

 
&lt;strong&gt;Install the plugin&lt;/strong&gt;&lt;br /&gt;
&lt;div class="CodeMacro"&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;$ git clone git://github.com/krasio/sfhoptoadnotifierplugin.git plugins/sfHoptoadNotifierPlugin&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


Add your Hoptoad API key in applications app.yml&lt;br /&gt;
&lt;div class="CodeMacro"&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;all:&lt;tt&gt;
&lt;/tt&gt;  sf_hoptoad_notifier_plugin:&lt;tt&gt;
&lt;/tt&gt;    api_key: you_api_key_goes_here&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;


Clear your cache&lt;br /&gt;
&lt;div class="CodeMacro"&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;$ symfony cc&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2009-04-10:734</id>
    <published>2009-04-10T10:51:00Z</published>
    <updated>2009-04-13T12:48:10Z</updated>
    <category term="bdd" />
    <category term="cucumber" />
    <link href="http://blog.codingspree.net/2009/4/10/cucumber-now-understands-bulgarian" rel="alternate" type="text/html" />
    <title>Cucumber now understands Bulgarian</title>
<content type="html">
            &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt; now has &lt;a href="http://github.com/aslakhellesoy/cucumber/commit/b51a1db1748556a848939a429929c248e0445f69"&gt;support for Bulgarian language&lt;/a&gt;. Yeah, it's only in &lt;a href="http://github.com/aslakhellesoy/cucumber/tree/master"&gt;
aslakhellesoy / cucumber&lt;/a&gt; for now, but I hope it will be included in next cucumber gem version.

&lt;br /&gt;&lt;br /&gt;
UPDATE: You can build the gem yourself:
&lt;div class="CodeMacro"&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;$git clone git://github.com/aslakhellesoy/cucumber.git&lt;tt&gt;
&lt;/tt&gt;$cd cucumber&lt;tt&gt;
&lt;/tt&gt;$rake install_gem&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2008-11-11:733</id>
    <published>2008-11-11T13:16:00Z</published>
    <updated>2008-11-11T13:17:30Z</updated>
    <category term="sfRestfulAuthenticationPlugin" />
    <category term="symfony" />
    <link href="http://blog.codingspree.net/2008/11/11/sfrestfulauthenticationplugin-released" rel="alternate" type="text/html" />
    <title>sfRestfulAuthenticationPlugin released</title>
<content type="html">
            I've just released my first symfony plugin named &lt;a href="http://www.symfony-project.org/plugins/sfRestfulAuthenticationPlugin"&gt;sfRestfulAuthenticationPlugin&lt;/a&gt;.
&lt;br /&gt;&lt;br /&gt;
As you can see from it's name it's something like a port of &lt;a href="http://github.com/technoweenie/restful-authentication/tree/master"&gt;technoweenie's restful_authentication plugin&lt;/a&gt;. It uses  some cool new features from symfony 1.2 like the &lt;a href="http://www.symfony-project.org/book/forms/1_2/en/"&gt;form framework&lt;/a&gt; and &lt;a href="http://www.aide-de-camp.org/talk/16/symfony-camp-2008-REST"&gt;RESTful routes&lt;/a&gt;.
&lt;br /&gt;&lt;br /&gt;
Tickets can be submitted on &lt;a href="http://sfrestfulauthenticationplugin.lighthouseapp.com"&gt;http://sfrestfulauthenticationplugin.lighthouseapp.com&lt;/a&gt;.
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2008-09-12:297</id>
    <published>2008-09-12T13:48:00Z</published>
    <updated>2008-09-12T13:55:33Z</updated>
    <category term="REST" />
    <category term="symfony" />
    <link href="http://blog.codingspree.net/2008/9/12/symfony-1-2-will-be-restful" rel="alternate" type="text/html" />
    <title>symfony 1.2 will be RESTful</title>
<content type="html">
            As we can see from &lt;a href="http://www.aide-de-camp.org/media/talk/2008/symfony-camp-2008-REST.pdf"&gt;this presentation&lt;/a&gt;, &lt;a href="http://www.symfony-project.org/"&gt;symfony 1.2&lt;/a&gt; (expected 10/2008) will be &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;RESTful&lt;/a&gt;.
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2008-05-12:42</id>
    <published>2008-05-12T19:15:00Z</published>
    <updated>2008-05-12T19:52:16Z</updated>
    <category term="capistrano" />
    <category term="symfony" />
    <link href="http://blog.codingspree.net/2008/5/12/deploying-symfony-project-with-capistrano" rel="alternate" type="text/html" />
    <title>Deploying symfony project with Capistrano</title>
<content type="html">
            As you may know &lt;a href="http://capify.org"&gt;Capistrano&lt;/a&gt; is a great tool "originally written to ease the pain of deploying Rails applications". If you are not familiar with it take a look at it's &lt;a href="http://capify.org/getting-started"&gt;getting started guide&lt;/a&gt;.
Even if Rails applications development is the primary way that people use Capistrano it can be used for a lot more than that.
&lt;br /&gt;&lt;br /&gt;
Let me show you how you can use it for easy-and-with-no-pain deployment of symfony project.
&lt;br /&gt;&lt;br /&gt;
First cd to your project and run (I assume that you have Capistrano installed allready)

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;$ capify .&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

to capify your project . This will create two files - Capify and config/deploy.rb. We'll use the second one for our symfony related tasks.
&lt;br /&gt;
So this is how the modifed deploy.rb file that I use to deploy my symfony projects looks like :
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;25&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;27&lt;tt&gt;
&lt;/tt&gt;28&lt;tt&gt;
&lt;/tt&gt;29&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;30&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;31&lt;tt&gt;
&lt;/tt&gt;32&lt;tt&gt;
&lt;/tt&gt;33&lt;tt&gt;
&lt;/tt&gt;34&lt;tt&gt;
&lt;/tt&gt;35&lt;tt&gt;
&lt;/tt&gt;36&lt;tt&gt;
&lt;/tt&gt;37&lt;tt&gt;
&lt;/tt&gt;38&lt;tt&gt;
&lt;/tt&gt;39&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;41&lt;tt&gt;
&lt;/tt&gt;42&lt;tt&gt;
&lt;/tt&gt;43&lt;tt&gt;
&lt;/tt&gt;44&lt;tt&gt;
&lt;/tt&gt;45&lt;tt&gt;
&lt;/tt&gt;46&lt;tt&gt;
&lt;/tt&gt;47&lt;tt&gt;
&lt;/tt&gt;48&lt;tt&gt;
&lt;/tt&gt;49&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;50&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;51&lt;tt&gt;
&lt;/tt&gt;52&lt;tt&gt;
&lt;/tt&gt;53&lt;tt&gt;
&lt;/tt&gt;54&lt;tt&gt;
&lt;/tt&gt;55&lt;tt&gt;
&lt;/tt&gt;56&lt;tt&gt;
&lt;/tt&gt;57&lt;tt&gt;
&lt;/tt&gt;58&lt;tt&gt;
&lt;/tt&gt;59&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;60&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;61&lt;tt&gt;
&lt;/tt&gt;62&lt;tt&gt;
&lt;/tt&gt;63&lt;tt&gt;
&lt;/tt&gt;64&lt;tt&gt;
&lt;/tt&gt;65&lt;tt&gt;
&lt;/tt&gt;66&lt;tt&gt;
&lt;/tt&gt;67&lt;tt&gt;
&lt;/tt&gt;68&lt;tt&gt;
&lt;/tt&gt;69&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;70&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;71&lt;tt&gt;
&lt;/tt&gt;72&lt;tt&gt;
&lt;/tt&gt;73&lt;tt&gt;
&lt;/tt&gt;74&lt;tt&gt;
&lt;/tt&gt;75&lt;tt&gt;
&lt;/tt&gt;76&lt;tt&gt;
&lt;/tt&gt;77&lt;tt&gt;
&lt;/tt&gt;78&lt;tt&gt;
&lt;/tt&gt;79&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;80&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;81&lt;tt&gt;
&lt;/tt&gt;82&lt;tt&gt;
&lt;/tt&gt;83&lt;tt&gt;
&lt;/tt&gt;84&lt;tt&gt;
&lt;/tt&gt;85&lt;tt&gt;
&lt;/tt&gt;86&lt;tt&gt;
&lt;/tt&gt;87&lt;tt&gt;
&lt;/tt&gt;88&lt;tt&gt;
&lt;/tt&gt;89&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;90&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;91&lt;tt&gt;
&lt;/tt&gt;92&lt;tt&gt;
&lt;/tt&gt;93&lt;tt&gt;
&lt;/tt&gt;94&lt;tt&gt;
&lt;/tt&gt;95&lt;tt&gt;
&lt;/tt&gt;96&lt;tt&gt;
&lt;/tt&gt;97&lt;tt&gt;
&lt;/tt&gt;98&lt;tt&gt;
&lt;/tt&gt;99&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;100&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;101&lt;tt&gt;
&lt;/tt&gt;102&lt;tt&gt;
&lt;/tt&gt;103&lt;tt&gt;
&lt;/tt&gt;104&lt;tt&gt;
&lt;/tt&gt;105&lt;tt&gt;
&lt;/tt&gt;106&lt;tt&gt;
&lt;/tt&gt;107&lt;tt&gt;
&lt;/tt&gt;108&lt;tt&gt;
&lt;/tt&gt;109&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;110&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;111&lt;tt&gt;
&lt;/tt&gt;112&lt;tt&gt;
&lt;/tt&gt;113&lt;tt&gt;
&lt;/tt&gt;114&lt;tt&gt;
&lt;/tt&gt;115&lt;tt&gt;
&lt;/tt&gt;116&lt;tt&gt;
&lt;/tt&gt;117&lt;tt&gt;
&lt;/tt&gt;118&lt;tt&gt;
&lt;/tt&gt;119&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;120&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;121&lt;tt&gt;
&lt;/tt&gt;122&lt;tt&gt;
&lt;/tt&gt;123&lt;tt&gt;
&lt;/tt&gt;124&lt;tt&gt;
&lt;/tt&gt;125&lt;tt&gt;
&lt;/tt&gt;126&lt;tt&gt;
&lt;/tt&gt;127&lt;tt&gt;
&lt;/tt&gt;128&lt;tt&gt;
&lt;/tt&gt;129&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;130&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;131&lt;tt&gt;
&lt;/tt&gt;132&lt;tt&gt;
&lt;/tt&gt;133&lt;tt&gt;
&lt;/tt&gt;134&lt;tt&gt;
&lt;/tt&gt;135&lt;tt&gt;
&lt;/tt&gt;136&lt;tt&gt;
&lt;/tt&gt;137&lt;tt&gt;
&lt;/tt&gt;138&lt;tt&gt;
&lt;/tt&gt;139&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;140&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;141&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;set &lt;span class="sy"&gt;:application&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;mysfapp&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;set &lt;span class="sy"&gt;:repository&lt;/span&gt;,  &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;http://path/to/the/version/control/repository&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# If you aren't deploying to /u/apps/#{application} on the target&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# servers (which is the default), you can specify the actual location&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# via the :deploy_to variable:&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;set &lt;span class="sy"&gt;:deploy_to&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;/path/to/project/&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;application&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# If there's no access to the repository from the production server, deploy via uploading tarball to the server&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;#set :deploy_via, :copy&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# If you aren't using Subversion to manage your source code, specify&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# your SCM below:&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# set :scm, :subversion&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;role &lt;span class="sy"&gt;:app&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;codingspree.net&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;role &lt;span class="sy"&gt;:web&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;codingspree.net&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# role :db,  &amp;quot;your db-server here&amp;quot;, :primary =&amp;gt; true&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;set &lt;span class="sy"&gt;:user&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;codingspree&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# path to php executable &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;set &lt;span class="sy"&gt;:php&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;/usr/local/php5/bin/php5&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="c"&gt;# symfony application name (used for migrations)&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;set &lt;span class="sy"&gt;:sf_app&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;frontend&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;namespace (&lt;span class="sy"&gt;:deploy&lt;/span&gt;) &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  desc &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;lt;&amp;lt;-DESC&lt;/span&gt;&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="k"&gt;&lt;tt&gt;
&lt;/tt&gt;    [internal] Overriding original task to fit to symfony project needs&lt;/span&gt;&lt;span class="dl"&gt;&lt;tt&gt;
&lt;/tt&gt;  DESC&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  task &lt;span class="sy"&gt;:finalize_update&lt;/span&gt;, &lt;span class="sy"&gt;:except&lt;/span&gt; =&amp;gt; { &lt;span class="sy"&gt;:no_release&lt;/span&gt; =&amp;gt; &lt;span class="pc"&gt;true&lt;/span&gt; } &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;chmod -R g+w &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;latest_release&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="r"&gt;if&lt;/span&gt; fetch(&lt;span class="sy"&gt;:group_writable&lt;/span&gt;, &lt;span class="pc"&gt;true&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;lt;&amp;lt;-CMD&lt;/span&gt;&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="k"&gt;&lt;tt&gt;
&lt;/tt&gt;      rm -rf &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;latest_release&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/log &amp;amp;&amp;amp;&lt;tt&gt;
&lt;/tt&gt;      ln -s &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;shared_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/log &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;latest_release&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/log&lt;/span&gt;&lt;span class="dl"&gt;&lt;tt&gt;
&lt;/tt&gt;    CMD&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;lt;&amp;lt;-CMD&lt;/span&gt;&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="k"&gt;&lt;tt&gt;
&lt;/tt&gt;      rm -rf &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;latest_release&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/cache &amp;amp;&amp;amp;&lt;tt&gt;
&lt;/tt&gt;      ln -s &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;shared_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/cache &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;latest_release&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/cache&lt;/span&gt;&lt;span class="dl"&gt;&lt;tt&gt;
&lt;/tt&gt;    CMD&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;tt&gt;
&lt;/tt&gt;    stamp = &lt;span class="co"&gt;Time&lt;/span&gt;.now.utc.strftime(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;%Y%m%d%H%M.%S&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    asset_paths = &lt;span class="s"&gt;&lt;span class="dl"&gt;%w(&lt;/span&gt;&lt;span class="k"&gt;images css js&lt;/span&gt;&lt;span class="dl"&gt;)&lt;/span&gt;&lt;/span&gt;.map { |p| &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;latest_release&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/web/&lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;p&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; }.join(&lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt; &lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;find &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;asset_paths&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; -exec touch -t &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;stamp&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; {} ';'; true&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:env&lt;/span&gt; =&amp;gt; { &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;TZ&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;UTC&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; }&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  desc &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;lt;&amp;lt;-DESC&lt;/span&gt;&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="k"&gt;&lt;tt&gt;
&lt;/tt&gt;    Overriding original task to exclude restart&lt;/span&gt;&lt;span class="dl"&gt;&lt;tt&gt;
&lt;/tt&gt;  DESC&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  task &lt;span class="sy"&gt;:default&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    update&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  desc &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;lt;&amp;lt;-DESC&lt;/span&gt;&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="k"&gt;&lt;tt&gt;
&lt;/tt&gt;    Overriding original task to use symfoy migrations (via sfMigrationsLightPlugin)&lt;/span&gt;&lt;span class="dl"&gt;&lt;tt&gt;
&lt;/tt&gt;  DESC&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  task &lt;span class="sy"&gt;:migrations&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    update&lt;tt&gt;
&lt;/tt&gt;    sf.migrate&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  after &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;deploy:update&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;deploy:customize&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  desc &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;lt;&amp;lt;-DESC&lt;/span&gt;&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="k"&gt;&lt;tt&gt;
&lt;/tt&gt;    All custom tasks will be here&lt;/span&gt;&lt;span class="dl"&gt;&lt;tt&gt;
&lt;/tt&gt;  DESC&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  task &lt;span class="sy"&gt;:customize&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# custmize it here&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    sf.symlinks&lt;tt&gt;
&lt;/tt&gt;    sf.remove_dev_environments&lt;tt&gt;
&lt;/tt&gt;    &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# clear cache&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    sf.cc&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;namespace (&lt;span class="sy"&gt;:sf&lt;/span&gt;) &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  desc &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;lt;&amp;lt;-DESC&lt;/span&gt;&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="k"&gt;&lt;tt&gt;
&lt;/tt&gt;    Run the &amp;quot;symfony migrate&amp;quot; task&lt;/span&gt;&lt;span class="dl"&gt;&lt;tt&gt;
&lt;/tt&gt;  DESC&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  task &lt;span class="sy"&gt;:migrate&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;cd &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;current_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;php&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; symfony migrate &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;sf_app&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;    &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  desc &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;lt;&amp;lt;-DESC&lt;/span&gt;&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="k"&gt;&lt;tt&gt;
&lt;/tt&gt;    Run the &amp;quot;symfony cc&amp;quot; task&lt;/span&gt;&lt;span class="dl"&gt;&lt;tt&gt;
&lt;/tt&gt;  DESC&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  task &lt;span class="sy"&gt;:cc&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;cd &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;current_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; &amp;amp;&amp;amp; rm -rf cache/*&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  desc &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;lt;&amp;lt;-DESC&lt;/span&gt;&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="k"&gt;&lt;tt&gt;
&lt;/tt&gt;    Create symlink to symfony specific targets&lt;/span&gt;&lt;span class="dl"&gt;&lt;tt&gt;
&lt;/tt&gt;  DESC&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  task &lt;span class="sy"&gt;:symlinks&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# symlink to database.yml&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;rm -rf &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;current_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/config/databases.yml&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;ln -s &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;shared_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/databases.yml &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;current_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/config/databases.yml&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# symlink to config.php    &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;rm -rf &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;current_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/config/config.php&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;ln -s &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;shared_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/config.php &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;current_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/config/config.php&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# symlink to sf data dir    &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;rm -rf &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;current_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/web/sf&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;ln -s /path/to/sf/data/dir &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;current_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/web/sf&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;        &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="c"&gt;# symlink to uploads    &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;rm -rf &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;current_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/web/uploads&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;ln -s &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;shared_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/uploads &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;current_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/web/uploads&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  desc &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;lt;&amp;lt;-DESC&lt;/span&gt;&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="k"&gt;&lt;tt&gt;
&lt;/tt&gt;    Remove DEV environments&lt;/span&gt;&lt;span class="dl"&gt;&lt;tt&gt;
&lt;/tt&gt;  DESC&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  task &lt;span class="sy"&gt;:remove_dev_environments&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;rm -rf &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;current_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt;/web/*_dev.php&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;    &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  desc &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;lt;&amp;lt;-DESC&lt;/span&gt;&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="k"&gt;&lt;tt&gt;
&lt;/tt&gt;    Disable symfony application&lt;/span&gt;&lt;span class="dl"&gt;&lt;tt&gt;
&lt;/tt&gt;  DESC&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  task &lt;span class="sy"&gt;:disable&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;cd &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;current_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;php&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; symfony disable &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;sf_app&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; prod&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;    &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  desc &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;lt;&amp;lt;-DESC&lt;/span&gt;&lt;/span&gt;&lt;span class="s"&gt;&lt;span class="k"&gt;&lt;tt&gt;
&lt;/tt&gt;    Enable symfony application&lt;/span&gt;&lt;span class="dl"&gt;&lt;tt&gt;
&lt;/tt&gt;  DESC&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  task &lt;span class="sy"&gt;:enable&lt;/span&gt; &lt;span class="r"&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    run &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;cd &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;current_path&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;php&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; symfony enable &lt;/span&gt;&lt;span class="il"&gt;&lt;span class="dl"&gt;#{&lt;/span&gt;sf_app&lt;span class="dl"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="k"&gt; prod&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;    &lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;   &lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


As you can see most of it is usual Capistrano configuration (user, repository, application, etc.) so I'll explain only the symfony related stuff.

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="c"&gt;# path to php executable &lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;set &lt;span class="sy"&gt;:php&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;/usr/local/php5/bin/php5&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

This variable is used to specify where PHP5 cli is placed (you know not all hostings are using PHP5 as default).

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="c"&gt;# symfony application name (used for migrations)&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;set &lt;span class="sy"&gt;:sf_app&lt;/span&gt;, &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;frontend&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


Here we specify the name of one of our symfony project applications. It will be needed to run migrations (you ARE using &lt;a href="http://trac.symfony-project.com/wiki/sfPropelMigrationsLightPlugin"&gt;sfPropelMigrationsLightPlugin&lt;/a&gt; allready, right?).
&lt;br /&gt;&lt;br /&gt;
In the next section of the deploy.rb file I overrided few of the original tasks from deploy namespace to fit to my needs - finalize_update to set symlinks to symfony cache and log directories, the default task to exclude restart because I don't need it, migrations to set it to use symfony migrations and at the end there is one hook task that will be executed after deploy:update -it's called customize and I'll place all custom tasks there.
&lt;br /&gt;&lt;br /&gt;
The last part of the file is &lt;strong&gt;sf&lt;/strong&gt; namespace that includes some symfony related tasks as migrate, cc, symlinks, remove_dev_environments, disable, enable and so on. As you see you can wrap any symfony task that you have to execute on the production server with Capistrano task.
&lt;br /&gt;&lt;br /&gt;
All you need now is to set a little bit the production server (run cap deploy:config, symlink document root to /path/to/project/mysfapp/current, place relevant database.yml and config.php in /path/to/project/mysfapp/shared, etc) and you are ready to run 

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;$ cap deploy&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


Thats it! Easy one command deployment! With migrations (cap deploy:migrate)! Hope it's explained clear enough (if not place your questions in the comments).
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2008-03-20:41</id>
    <published>2008-03-20T14:39:00Z</published>
    <updated>2008-08-07T14:23:06Z</updated>
    <category term="euruko" />
    <category term="ruby" />
    <link href="http://blog.codingspree.net/2008/3/20/see-ya-euruko-2008" rel="alternate" type="text/html" />
    <title>See ya @ EuRuKo 2008</title>
<content type="html">
            &lt;a href="http://blog.codingspree.net/assets/2008/3/20/Screenshot-Attendees___EURUKO_2008_-_Mozilla_Firefox.png"&gt;&lt;/a&gt;
&lt;br /&gt;
This year's portion of beer and ruby is waiting me in Prague at &lt;a href="http://www.euruko2008.org"&gt;euruko2008.org&lt;/a&gt;&lt;br /&gt;

See ya there ;)
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2007-11-12:10</id>
    <published>2007-11-12T22:18:00Z</published>
    <updated>2007-11-12T22:21:28Z</updated>
    <category term="rails" />
    <link href="http://blog.codingspree.net/2007/11/12/how-to-generate-urls-for-actionmailer-emails" rel="alternate" type="text/html" />
    <title>How to generate urls for ActionMailer emails</title>
<content type="html">
            This is a little bit tricky, but I've found an solution in the comments from &lt;a href="http://jakescruggs.blogspot.com/2007/02/actionmailer-tips.html"&gt;other article&lt;/a&gt; on this problem.

First we need to set default_url_options for ActionMailer::Base. This can be done with before_filter method in ApplicationController

&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&lt;span class="r"&gt;class&lt;/span&gt; &lt;span class="cl"&gt;ApplicationController&lt;/span&gt; &amp;lt; &lt;span class="co"&gt;ActionController&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  before_filter &lt;span class="sy"&gt;:set_default_url_options_for_mailers&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;set_default_url_options_for_mailers&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class="co"&gt;ActionMailer&lt;/span&gt;::&lt;span class="co"&gt;Base&lt;/span&gt;.default_url_options[&lt;span class="sy"&gt;:host&lt;/span&gt;] = request.host_with_port&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


Now we can generate the url in the mailer model
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;  &lt;span class="r"&gt;def&lt;/span&gt; &lt;span class="fu"&gt;email_confirmation&lt;/span&gt;(user)&lt;tt&gt;
&lt;/tt&gt;    recipients user.email&lt;tt&gt;
&lt;/tt&gt;    from  &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;example.com  &amp;lt;no-reply@example.com&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    subject &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;Confirm your email address&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    content_type &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;text/html&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    body &lt;span class="sy"&gt;:user&lt;/span&gt; =&amp;gt; user, &lt;span class="sy"&gt;:activation_page&lt;/span&gt; =&amp;gt; url_for(&lt;span class="sy"&gt;:controller&lt;/span&gt; =&amp;gt; &lt;span class="s"&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;main&lt;/span&gt;&lt;span class="dl"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:action&lt;/span&gt; =&amp;gt; &lt;tt&gt;
&lt;/tt&gt;    &lt;span class="s"&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="k"&gt;activate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="sy"&gt;:only_path&lt;/span&gt; =&amp;gt; &lt;span class="pc"&gt;false&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  &lt;span class="r"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2007-09-11:6</id>
    <published>2007-09-11T10:13:00Z</published>
    <updated>2007-09-11T10:18:34Z</updated>
    <category term="propel" />
    <category term="symfony" />
    <link href="http://blog.codingspree.net/2007/9/11/adding-callbacks-for-propel-models-in-symfony-project" rel="alternate" type="text/html" />
    <title>Adding callbacks for Propel models in symfony project</title>
<content type="html">
            This is a simple how-to that describes adding callbacks for Propel models in symfony project
 (like those usefull methods in &lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html"&gt;ActiveRecord::Callbacks&lt;/a&gt; module).
&lt;br /&gt;&lt;br /&gt;
Step 1 : Enable Propel behaviors in &lt;strong&gt;config/propel.ini&lt;/strong&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;propel.builder.AddBehaviors = true     // Default value is false&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

Step 2 : Register the callback method and define it in model class - for example &lt;strong&gt;lib/model/Page.php&lt;/strong&gt;
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;class PageTab extends BasePageTab&lt;tt&gt;
&lt;/tt&gt;{&lt;tt&gt;
&lt;/tt&gt;  function preSave(BaseObject $object, $con)&lt;tt&gt;
&lt;/tt&gt;  {&lt;tt&gt;
&lt;/tt&gt;    &lt;tt&gt;
&lt;/tt&gt;  }&lt;tt&gt;
&lt;/tt&gt;}&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;sfMixer::register('BasePageTab:save:pre', array('PageTab', 'preSave'));&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

Step 3 : Rebuild the model
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;$ symfony propel-build-model&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

&lt;br /&gt;

There is much more detailed article on this topic by &lt;a href="http://redotheweb.com"&gt;FranÃƒÂ§ois Zaninotto&lt;/a&gt; called &lt;a href="http://redotheweb.com/2007/09/02/understanding-behaviors/"&gt;"Understanding Behaviors"&lt;/a&gt;
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2007-09-10:5</id>
    <published>2007-09-10T15:24:00Z</published>
    <updated>2008-03-11T12:05:42Z</updated>
    <category term="MVC" />
    <category term="symfony" />
    <link href="http://blog.codingspree.net/2007/9/10/skinny-controller-fat-model-in-sympfony-project" rel="alternate" type="text/html" />
    <title>"Skinny Controller, Fat Model" approach  in symfony project</title>
<content type="html">
            A very common error when you first start to write an application in the MVC way is bypassing some of the components or just not using it as it should.
&lt;br /&gt;
This problem and an example how to do it in the "right way" are described in a one of &lt;a href="http://weblog.jamisbuck.org"&gt;Jamis Buck's&lt;/a&gt; posts called &lt;a href="http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model"&gt;Skinny Controller, Fat Model&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;
Here is a cover-up version of the code from that post ported to symfony/PHP...
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Before&lt;/strong&gt; (or how-NOT-to-do-it example) :
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&amp;lt;!-- listSuccess.php --&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;?php&lt;tt&gt;
&lt;/tt&gt;  foreach ($path as $breadcrumb=&amp;gt;$name)&lt;tt&gt;
&lt;/tt&gt;  {&lt;tt&gt;
&lt;/tt&gt;    ?&amp;gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;a href=&amp;quot;&amp;lt;?=url_for($breadcrumb)?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?=__($name)?&amp;gt;&amp;lt;/a&amp;gt; / &lt;tt&gt;
&lt;/tt&gt;    &amp;lt;?&lt;tt&gt;
&lt;/tt&gt;  }&lt;tt&gt;
&lt;/tt&gt;  &lt;tt&gt;
&lt;/tt&gt;  foreach ($people as $p)&lt;tt&gt;
&lt;/tt&gt;  {&lt;tt&gt;
&lt;/tt&gt;    ?&amp;gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;div id=&amp;quot;person-&amp;lt;?=$p-&amp;gt;getId()?&amp;gt;&amp;quot;&amp;gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;span class=&amp;quot;name&amp;quot;&amp;gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;?=$p-&amp;gt;getLastName()?&amp;gt;, &amp;lt;?=$p-&amp;gt;getFirstName()?&amp;gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;span class=&amp;quot;age&amp;quot;&amp;gt;&lt;tt&gt;
&lt;/tt&gt;          &amp;lt;?= (date('Y') - date('Y', strtotime($p-&amp;gt;getBirthdate()))) ?&amp;gt;&lt;tt&gt;
&lt;/tt&gt;        &amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;      &amp;lt;/div&amp;gt;&lt;tt&gt;
&lt;/tt&gt;    &amp;lt;?&lt;tt&gt;
&lt;/tt&gt;  }&lt;tt&gt;
&lt;/tt&gt;?&amp;gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;# actions.php&lt;tt&gt;
&lt;/tt&gt;class personsActions extends sfActions&lt;tt&gt;
&lt;/tt&gt;{&lt;tt&gt;
&lt;/tt&gt;  public function executeList()&lt;tt&gt;
&lt;/tt&gt;  {&lt;tt&gt;
&lt;/tt&gt;    $c = new Criteria;&lt;tt&gt;
&lt;/tt&gt;    $c-&amp;gt;add(PersonPeer::ADDED_AT, date('Y-m-d'), Criteria::GREATER_EQUAL);&lt;tt&gt;
&lt;/tt&gt;    $c-&amp;gt;add(PersonPeer::DELETED, false);&lt;tt&gt;
&lt;/tt&gt;    &lt;tt&gt;
&lt;/tt&gt;    $this-&amp;gt;people = Person::doSelect($c);&lt;tt&gt;
&lt;/tt&gt;  }&lt;tt&gt;
&lt;/tt&gt;}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;# PersonPeer.php&lt;tt&gt;
&lt;/tt&gt;class PersonPeer extends BasePersonPeer&lt;tt&gt;
&lt;/tt&gt;{&lt;tt&gt;
&lt;/tt&gt;}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


&lt;strong&gt;After&lt;/strong&gt; (or do-it-in-this-way example) :
&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;&amp;lt;!-- listSuccess.php --&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;?php echo breadcrumbs($path) ?&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;?php foreach ($people as $p): ?&amp;gt;&lt;tt&gt;
&lt;/tt&gt;  &amp;lt;div id=&amp;quot;person-&amp;lt;?php echo $p-&amp;gt;getId()?&amp;gt;&amp;quot;&amp;gt;&lt;tt&gt;
&lt;/tt&gt;    &amp;lt;span class=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;?php echo $p-&amp;gt;getFullName()?&amp;gt;&amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;    &amp;lt;span class=&amp;quot;age&amp;quot;&amp;gt;&amp;lt;?php echo $p-&amp;gt;getAge()?&amp;gt;&amp;lt;/span&amp;gt;&lt;tt&gt;
&lt;/tt&gt;  &amp;lt;/div&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;? endforeach;?&amp;gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;# actions.php&lt;tt&gt;
&lt;/tt&gt;class personsActions extends sfActions&lt;tt&gt;
&lt;/tt&gt;{&lt;tt&gt;
&lt;/tt&gt;  public function executeList()&lt;tt&gt;
&lt;/tt&gt;  {&lt;tt&gt;
&lt;/tt&gt;    $this-&amp;gt;people = PersonPeer::findRecent();&lt;tt&gt;
&lt;/tt&gt;  }&lt;tt&gt;
&lt;/tt&gt;}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


&lt;table class="CodeRay"&gt;&lt;tr&gt;
  &lt;td title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;24&lt;tt&gt;
&lt;/tt&gt;25&lt;tt&gt;
&lt;/tt&gt;26&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class="code"&gt;&lt;pre&gt;# PersonPeer.php&lt;tt&gt;
&lt;/tt&gt;class PersonPeer extends BasePersonPeer&lt;tt&gt;
&lt;/tt&gt;{&lt;tt&gt;
&lt;/tt&gt;  public function findRecent()&lt;tt&gt;
&lt;/tt&gt;  {&lt;tt&gt;
&lt;/tt&gt;    $c = new Criteria;&lt;tt&gt;
&lt;/tt&gt;    $c-&amp;gt;add(self::ADDED_AT, date('Y-m-d'), Criteria::GREATER_EQUAL);&lt;tt&gt;
&lt;/tt&gt;    $c-&amp;gt;add(self::DELETED, false);&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;    return self::doSelect($c);&lt;tt&gt;
&lt;/tt&gt;  }&lt;tt&gt;
&lt;/tt&gt;}&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;# Person.php&lt;tt&gt;
&lt;/tt&gt;class Person extends BasePerson&lt;tt&gt;
&lt;/tt&gt;{&lt;tt&gt;
&lt;/tt&gt;  public function getFullName()&lt;tt&gt;
&lt;/tt&gt;  {&lt;tt&gt;
&lt;/tt&gt;    return $this-&amp;gt;getLastName() . ', ' . $p-&amp;gt;getFirstName();&lt;tt&gt;
&lt;/tt&gt;  }&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  public function getAge()&lt;tt&gt;
&lt;/tt&gt;  {&lt;tt&gt;
&lt;/tt&gt;    return (date('Y') - date('Y', strtotime($this-&amp;gt;getBirthdate())));&lt;tt&gt;
&lt;/tt&gt;  }&lt;tt&gt;
&lt;/tt&gt;}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2007-08-28:3</id>
    <published>2007-08-28T15:14:00Z</published>
    <updated>2007-09-07T17:15:49Z</updated>
    <category term="eclipse" />
    <category term="regexp" />
    <link href="http://blog.codingspree.net/2007/8/28/eclipse-regular-expression-tester" rel="alternate" type="text/html" />
    <title>Eclipse Regular Expression Tester</title>
<content type="html">
            Today, while searching for online regular expressions tester I've found this very nice plugin - &lt;a href="http://www.brosinski.com/regex/"&gt;Eclipse Regular Expression Tester&lt;/a&gt;.
Give it a try!
&lt;br /&gt;
&lt;a href="http://www.brosinski.com/regex/"&gt;
&lt;/a&gt;
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2007-08-07:2</id>
    <published>2007-08-07T17:10:00Z</published>
    <updated>2007-09-07T17:33:32Z</updated>
    <category term="agile" />
    <category term="ruby" />
    <link href="http://blog.codingspree.net/2007/8/7/presentation-applying-agile-to-ruby" rel="alternate" type="text/html" />
    <title>Presentation: Applying Agile to Ruby</title>
<content type="html">
            Another great &lt;a href="http://www.infoq.com/presentations/applying-agile-to-ruby"&gt;talk&lt;/a&gt; on &lt;a href="http://www.infoq.com"&gt;infoq.com&lt;/a&gt;. By Fred George.
          </content>  </entry>
  <entry xml:base="http://blog.codingspree.net/">
    <author>
      <name>krasio</name>
    </author>
    <id>tag:blog.codingspree.net,2007-07-09:1</id>
    <published>2007-07-09T16:11:00Z</published>
    <updated>2007-09-07T16:13:47Z</updated>
    <category term="ruby" />
    <link href="http://blog.codingspree.net/2007/7/9/presentation-the-beauty-of-ruby" rel="alternate" type="text/html" />
    <title>Presentation: The Beauty of Ruby</title>
<content type="html">
            In &lt;a href="http://www.infoq.com/presentations/beauty-of-ruby-vanderburg"&gt;this&lt;/a&gt; talk &lt;a href="http://www.vanderburg.org/Blog"&gt;Glenn Vanderburg&lt;/a&gt; demonstrates some of the subtle beauty that experienced Rubyists know and love.
          </content>  </entry>
</feed>
