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

<channel>
	<title>Symfony Resource Central</title>
	<atom:link href="http://symforc.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://symforc.com</link>
	<description>Web development made simple</description>
	<lastBuildDate>Wed, 17 Mar 2010 00:00:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Blog&#160;update</title>
		<link>http://symforc.com/2010/03/17/blog-update/</link>
		<comments>http://symforc.com/2010/03/17/blog-update/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 00:00:14 +0000</pubDate>
		<dc:creator>Romain Dorgueil</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.guu.dakrazy.net/?p=46</guid>
		<description><![CDATA[This is a pretty short note to say I finally migrated this blog from dotclear to wordpress. After years of painfull submission, and being too busy to reinvent the wheel, I finally made the move. I hope that problems won&#8217;t start again after a few month of worpressing.
Please apologize for the first design draft, as [...]]]></description>
			<content:encoded><![CDATA[<p>This is a pretty short note to say I finally migrated this blog from dotclear to wordpress. After years of painfull submission, and being too busy to reinvent the wheel, I finally made the move. I hope that problems won&#8217;t start again after a few month of worpressing.</p>
<p>Please apologize for the first design draft, as it&#8217;s not finished at all.</p>
]]></content:encoded>
			<wfw:commentRss>http://symforc.com/2010/03/17/blog-update/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Roots &#8211; Part I &#8211; HTTP is the web&#8217;s&#160;language</title>
		<link>http://symforc.com/2010/01/24/the-roots-part-i-http-is-the-webs-language/</link>
		<comments>http://symforc.com/2010/01/24/the-roots-part-i-http-is-the-webs-language/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 22:30:00 +0000</pubDate>
		<dc:creator>Romain Dorgueil</dc:creator>
				<category><![CDATA[the roots]]></category>
		<category><![CDATA[basics]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[protocol]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">urn:md5:34de824dee3daf030efc85683524a156</guid>
		<description><![CDATA[Everybody working in web development knows about this, right?
I realized recently that it was far from being true. While frameworks and ORMs make web developers&#8217; job easier and easier, more and more people comes to develop websites without knowing about the real basics. They use relational databases without knowing anything about SQL, and they develop [...]]]></description>
			<content:encoded><![CDATA[<p>Everybody working in web development knows about this, right?</p>
<p>I realized recently that it was far from being true. While frameworks and ORMs make web developers&#8217; job easier and easier, more and more people comes to develop websites without knowing about the real basics. They use relational databases without knowing anything about SQL, and they develop websites without understanding how the client will talk with their website.</p>
<p>I don&#8217;t pretend to make a revolution there, but if I bring my car to the car mechanic, I hope he will know a bit more about it than &#8220;engine makes power, and so the car is working&#8221;. So are my exigences when I ask a specialist to work on a website.</p>
<p>To give a parallel with playing music, you can learn to play some songs without knowing anything about harmony and rhythm, but is you want to get serious about what you play, it will become an absolute requirement.</p>
<p>I so decided to make some short articles explaining in simple terms what those basis are, to my humble opinion. First one is about HTTP.<a hreflang="en" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.3"></a></p>
<h2>So what is HTTP ?</h2>
<p>HTTP is a <strong>communication protocol</strong> that comes at <strong>application level</strong>. In easier terms, it means that it&#8217;s a language that allows two applications to communicate by exchanging <strong>messages</strong>. How those messages will transit between the two applications is not HTTP purpose, and in a network-less world, you can even imagine exchanging messages on floppy drives. In the real world, we prefer make it transit over networks, using some low levels network protocols like TCP/IP.</p>
<p>As it&#8217;s true 99% of the time, we will assume it&#8217;s always true: HTTP is the communication language, TCP/IP will handle the transport of HTTP messages between actors.</p>
<p>Let&#8217;s go back to the original definition.</p>
<p>HTTP 1.1 (the last protocol version) is defined by <a hreflang="en" href="http://www.w3.org/Protocols/rfc2616/rfc2616.html">RFC 2616</a>, which says:</p>
<blockquote><p>The Hypertext Transfer Protocol (HTTP) is an application-level protocol for distributed, collaborative, hypermedia information systems. HTTP has been in use by the World-Wide Web global information initiative since 1990.</p>
<p>&#8230;</p>
<p>The HTTP protocol is a request/response protocol. A client sends a request to the server in the form of a request method, URI, and protocol version, followed by a MIME-like message containing request modifiers, client information, and possible body content over a connection with a server. The server responds with a status line, including the message&#8217;s protocol version and a success or error code, followed by a MIME-like message containing server information, entity metainformation, and possible entity-body content.</p></blockquote>
<p>This is the absolute minimum to know. HTTP is a communication language, and works in a request-message, response-message way. This is extremely simple. The RFC then explain that it can do much more complicated things, like handling messages that will go through many nodes before reaching destination, but let&#8217;s keep it simple, and say that from a client or server point of view, it will result in exactly the same thing.</p>
<p>The RFC also makes clear that HTTP is not dependent on the transport mean:</p>
<blockquote><p>HTTP communication usually takes place over TCP/IP connections. The default port is TCP 80, but other ports can be used. This does not preclude HTTP from being implemented on top of any other protocol on the Internet, or on other networks. HTTP only presumes a reliable transport; any protocol that provides such guarantees can be used; the mapping of the HTTP/1.1 request and response structures onto the transport data units of the protocol in question is outside the scope of this specification.</p></blockquote>
<p>And it will be out of the scope of this blog post too. HTTP doesn&#8217;t care about how the message transport is done, but it&#8217;s usually handled by TCP/IP.</p>
<h2>Messages, requests, responses</h2>
<p>So the basic communication tool will be <strong>messages</strong>. A client to server message is called a <strong>request</strong>, and the server to client &#8220;answer&#8221; is called a <strong>response</strong>. Even if it may seems obvious, a response cannot be the server initiative: a client must have made a request, and server response is the response to this request.</p>
<p>Now we&#8217;re pretty confident about HTTP messages being Tupperware boxes containing informations. Let&#8217;s make a step forward and look at how this box content is structured.</p>
<p>Messages consists of three parts: the <strong>start line</strong>, the <strong>headers</strong>, and the <strong>body</strong>. As each part has specific rules depending on if the message is a request or a response, we&#8217;ll have a look at both separately.</p>
<h3>The request</h3>
<p>The request start line is pretty easy to understand, it will tell the server what we are requesting.</p>
<pre>GET /path/to/file/index.html HTTP/1.0</pre>
<p>Here it tells we&#8217;re using HTTP GET method, to retrieve resource located at the /path/to/file/index.html URI (uniform resource identifier). It also contains what protocol variant we&#8217;re using, to be sure we speak the exact same language.</p>
<p>I will come back a bit later on what are <strong>HTTP methods</strong>, and will refer them as &#8220;methods&#8221; from now on.</p>
<p>After this, the client will send the headers. Headers are a key-value list of properties, that transmit various informations about the client, it&#8217;s capabilities, what it&#8217;s expecting, and the message itself. I won&#8217;t go over every <a hreflang="en" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.3">standard request headers</a>.</p>
<p>Depending on what method is used, the request&#8217;s body may or may not contain data. For example, if we simply get google&#8217;s homepage, it won&#8217;t contain any data. If we&#8217;re uploading a file, or POST-ing form data to the server, the body will be those data container.</p>
<h3>The response</h3>
<p>Once server received the request, it will pass it to a handler, which can be about anything. In PHP applications, hosted on an apache server, chances are that apache will call mod_php to handle the request, and build a response it will send back to the client. But that&#8217;s only one possibility amongst a huge infinite list, which is outside the scope of this blog post.</p>
<p>Anyway, the handler takes an http request as its input, and builds an http response, starting by the response start line.</p>
<pre>HTTP/1.0 200 OK</pre>
<p>This is a pretty standard response. Server starts by saying which protocol variant it&#8217;s using, then sends a computer readable status code, followed by an human readable translation of this status code.</p>
<p>A <a hreflang="en" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10">complete list of HTTP status codes</a> is available at many places on the internet, and it&#8217;s useless to know them all. Googling &#8220;http status code&#8221; when you&#8217;re looking for the adequate status should be far enough.</p>
<p>The most important thing to know is the different status code classes, defined by the first digit of the code:</p>
<ul>
<li>1xx: Informational &#8211; Request received, continuing process.</li>
<li>2xx: Success &#8211; The action was successfully received, understood, and accepted.</li>
<li>3xx: Redirection &#8211; Further action must be taken in order to complete the request.</li>
<li>4xx: Client Error &#8211; The request contains bad syntax or cannot be fulfilled.</li>
<li>5xx: Server Error &#8211; The server failed to fulfill an apparently valid request.</li>
</ul>
<p>Some practical direct application of this is when you need to choose between sending back a 404 error and a 500 error. 404 is client&#8217;s fault. He asked for something that does not exist, and you tell him so. No problem. 500 means that server tried hard to build a response, but something forbid it to achieve its goal. This is a server-side application problem, and you should monitor, and correct this as soon as possible.</p>
<p>After sending the start line, the response, being a faithful HTTP message, will go on by sending the headers. Like for the request, headers will give informations about the server and the message content. You can consider it as the README file that will help the <strong>user agent</strong> (http client software) to understand the response.</p>
<p>Then, the response message will often contain a body (unless you&#8217;re using some method requiring not to have it), and the most seen cases are either HTML content, XML/JSON (or similar) response that will be treated by a client-side web application (flash, javascript, &#8230;), or binary content (for a file download, for example).</p>
<h2>HTTP methods</h2>
<p>What is it? Beside being one word in the request start line, the HTTP method is the client&#8217;s way to tell the server what kind of operation it wants to perform on the resource requested. The method used in a request have direct implications on what kind of work you can do server-side, and should be choosen carefully (of course, you can break this rule, but it&#8217;s a very bad idea).</p>
<h3>Safe methods</h3>
<p>Some methods are said &#8220;safe&#8221;. This means that request is a retrieval operation, and should not do any other work. Notice that &#8220;should&#8221; does not mean &#8220;must&#8221;, but user cannot be held responsible for breaking something if the method used was &#8220;safe&#8221;.</p>
<p>For example, you should not allow GET methods to create, delete or change files, database records, or LDAP nodes (non exhaustive, of course).</p>
<p>This is the case of GET and HEAD methods.</p>
<h3>Idempotent methods</h3>
<p>Idempotents methods are those which won&#8217;t have any side-effect if repeated more than once.</p>
<p>For example, the DELETE method, which asks for a resource deletion, should have the exact same effect if it&#8217;s called only once on resource A, or if it&#8217;s called ten times. The overall effect should be the resource deletion (if allowed), not less, not more.</p>
<p>This is the case of GET, HEAD, PUT and DELETE methods.</p>
<h3>Non-safe and non-idempotent methods</h3>
<p>But of course, some requests needs to take risky and/or non-repeatable actions server side. When an user agent uses such a method, he will be aware of the risks.</p>
<p>For example, POST-ing a comment will create a database record, and if you make twice the same request (unless some protection has been developed to prevent this), you will actually create two database records.</p>
<p>It&#8217;s the exact reason why browsers ask for user confirmation before repeating a POST request, if user asks for a refresh. It&#8217;s also the reason why you should redirect to a safe idempotent resource after a successful form submission, to forbid user to be able to repeat request.</p>
<p>This is the case of POST method.</p>
<h3>And the real world</h3>
<p>All those methods are defined by the HTTP RFC, but the real world is much more restricted than that. In fact, modern browsers only support GET and POST methods, so you should only care about those.</p>
<p>You should just keep in mind that other HTTP methods exist, and for example HTTP extensions like WebDav (which is used by microsoft and their &#8220;online folders&#8221;) use them. A simple way to try out PUT, DELETE, or any other method is to use curl as an http client.</p>
<p>To learn more about specificities of all methods, <a hreflang="en" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html">you can still refer to the original RFC</a>.</p>
<h3>Example</h3>
<h4>The request&#8230;</h4>
<pre>GET /index.html HTTP/1.1
Host: www.example.com</pre>
<p>Nothing complicated here, but for curious people (and you should be curious):</p>
<ul>
<li>example.com is <a hreflang="en" href="http://www.rfc-editor.org/rfc/rfc2606.txt">a special domain reserved by the RFC 2606</a>. This domain won&#8217;t bring any conflict with a real domain, never. You should use it for all your tests and examples.</li>
<li>The &#8220;Host&#8221; header is required by HTTP 1.1 protocol, and is used by web servers to provide name based virtual hosting of different websites on the same IP address.</li>
</ul>
<h4>and the response!</h4>
<pre>HTTP/1.1 200 OK
Date: Sun, 24 Jan 2010 22:38:34 GMT
Server: Apache (Boubounetout/Linux)
Last-Modified: Fri, 01 Jan 2010 23:11:55 GMT
Etag: "f3f80-1b6-de1b034b"
Accept-Ranges: bytes
Content-Length: 438
Connection: close
Content-Type: text/html; charset=UTF-8

&lt;html&gt;
  &lt;head&gt;&lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Welcome&lt;/h1&gt;
    &lt;p&gt;Hello, world!&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
<h2>Conclusion</h2>
<p>I hope that I&#8217;m far from being alone claiming that this is the very basis of any serious web development, and that it will makes your web developer life easier just because you understand the underlying communication language. Yes, HTTP is definitely the web&#8217;s language, and you should be aware of it.</p>
<p>Ok folks, this will be all for today. But keep tuned, next episodes are already in the pipes.</p>
<p>Thanks to <a hreflang="en" href="http://www.funstaff.ch/">Bertrand Zuchuat</a> for giving feedback and ideas before the article publication.</p>
]]></content:encoded>
			<wfw:commentRss>http://symforc.com/2010/01/24/the-roots-part-i-http-is-the-webs-language/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sfDynamicsPlugin towards 1.0&#160;release</title>
		<link>http://symforc.com/2009/12/16/sfdynamicsplugin-towards-1-0-release/</link>
		<comments>http://symforc.com/2009/12/16/sfdynamicsplugin-towards-1-0-release/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 22:45:00 +0000</pubDate>
		<dc:creator>Romain Dorgueil</dc:creator>
				<category><![CDATA[dynamics]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">urn:md5:2c0d8a15a35c420ac77ac5ef28139f93</guid>
		<description><![CDATA[It&#8217;s been quite a while since the last big update, and after today&#8217;s one, I decided to release 0.9.6 version (0.9.5 did not have symfony 1.4 support advertised in package.xml, so I created a new one for this).
Little sum up of new features:

Symfony cache is now used in debug mode too, but it checks assets [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been quite a while since the last big update, and after today&#8217;s one, I decided to release 0.9.6 version (0.9.5 did not have symfony 1.4 support advertised in package.xml, so I created a new one for this).</p>
<p>Little sum up of new features:</p>
<ul>
<li>Symfony cache is now used in debug mode too, but it checks assets modification timestamps to know if a recompilation is needed. This timestamp check is not done in non-debug mode, to avoid overhead.</li>
<li>An asset filter chain, fully configurable, extensible and backward compatible is now there. The process is pretty simple: you can write subclasses of <em>sfDynamicsBaseAssetFilter</em> to implement your last great idea about assets filtering. Then, just register it in your app.yml under the section <em>sfDynamicsPlugin/concatenated_javascript_filter_chain</em> (or the same with stylesheet). A full working example is available on the new <a href="http://dynamics.dakrazy.net/documentation/configuration-application_configuration" hreflang="en">application configuration</a> page, that describe all app.yml configuration directives. By the way, the default asset filtair chain is exactly the same as before.</li>
<li>To demonstrate this new feature, a <em>sfDynamicsExperimentalClosureAPIJavascriptFilter</em> class has been added. It is an asset filter that calls the Google Closure Compiler API, via an HTTP POST request. Of course, it is not a good idea to do so on a «real» website, but this class is here for demonstration purpose.</li>
<li>Along with the new documentation page, a set of configuration values that were guessed depending on if you are in debug mode, or not, are now  configurable via the app.yml of each applications. Of course, the default value is fully backward compatible.</li>
<li>Last feature, which is more polishing than a feature, is that your project won&#8217;t show up if the sfDynamics module is disabled but required for some assets. Instead, an exception will explain what&#8217;s missing.</li>
</ul>
<p>All those features are tested since a few weeks, and a simple cache:clear after upgrading the plugin should keep your project in a nice state. Or at least, I hope so&#8230;</p>
<p>The global goal of this release is to tend towards 1.0, by making all existing features configurable and extensible, so that 1.0 branch will be able to remain stable and 100% backward compatible for a long time.</p>
<p>See you space symfonists!</p>
]]></content:encoded>
			<wfw:commentRss>http://symforc.com/2009/12/16/sfdynamicsplugin-towards-1-0-release/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>All about backward&#160;compatibility&#8230;</title>
		<link>http://symforc.com/2009/09/23/all-about-backward-compatibility/</link>
		<comments>http://symforc.com/2009/09/23/all-about-backward-compatibility/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 21:30:00 +0000</pubDate>
		<dc:creator>Romain Dorgueil</dc:creator>
				<category><![CDATA[autoload]]></category>
		<category><![CDATA[bc]]></category>
		<category><![CDATA[discussion]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[regression]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">urn:md5:66ad6d63e789cfcc308a020b9c0c05c2</guid>
		<description><![CDATA[Backward compatibility sounds nice, but it&#8217;s not so easy to respect it in big projects. And the whole interest is on big projects: it&#8217;s maybe not such a problem if your grand-ma&#8217;s blog breaks its API on each release, but there would be a revolution (or not?) if win32 API was changing on each enslavement [...]]]></description>
			<content:encoded><![CDATA[<p>Backward compatibility sounds nice, but it&#8217;s not so easy to respect it in big projects. And the whole interest <ins>is</ins> on big projects: it&#8217;s maybe not such a problem if your grand-ma&#8217;s blog breaks its API on each release, but there would be a revolution (or not?) if win32 API was changing on each <del>enslavement</del> service pack microsoft releases.</p>
<p>Here is a real story case study of a BC break that happened on the PHP language itself.</p>
<p>It&#8217;s always tempting to say «hey, this feature is so great, and has so little impact on the way it works, it may be cool to include it it the stable branch, don&#8217;t you think?». Well, it can be cool, if it cannot have any effect on existing projects. But let&#8217;s think again. How can it have no effect on the existing projects? And if it has no effect, why include it in this branch?</p>
<p>I don&#8217;t think there is a definite answer to this, as it <ins>may</ins> have pros sometimes. But most of the time, it will have much more cons than pros. And if you doubt, forget it. Bigger is the project you work in, more it will have users depending on it, and if there is any way users could have used the old &#8220;buggy&#8221; feature, for sure they did.</p>
<p>I want to expose some real life case that happened recently, on the PHP distribution itself, showing its snowball effect through symfony to real life projects.</p>
<p>Let&#8217;s have a look at <a href="http://bugs.php.net/44144" hreflang="en">this php bug report</a>. It says «spl_autoload_functions() should return object instances, not class<br />
names, when appropriate.»</p>
<p>Two words are really interesting in this bug report. It is &#8220;should&#8221; and &#8220;when appropriate&#8221;. There is many assumptions behind this. When is this &#8220;appropriate&#8221;? Why &#8220;should&#8221; it return instances? I would better rephrase it as «Feature request: spl_autoload_functions() must return object instances, as it is more appropriate than strings containing class names.». The overall formulation is not so much important as the facts that:</p>
<ul>
<li>it is a feature request, not a bug</li>
<li>the function is currently working, but its behaviour can be changed to a more convenient one.</li>
</ul>
<p>But it&#8217;s ok, right? The target version was 5.3 while still no stable releases existed.</p>
<p>Yes it is.</p>
<p>Oh wait, let&#8217;s read the comments now.</p>
<p>«Thanks for the fix. Do you think, by any chance, we can sneak this into PHP 5.2, or is that impossible?»</p>
<p>The definite answer to this question should be «It is actually impossible. Introducing a behavior change into 5.2 (years) stable release would break backward compatibility.»</p>
<p>And the patch made it to PHP 5.2.11.</p>
<p>Is there any consequences? Yes of course. In fact any symfony 1.3 projects were broken at this stage, because symfony used this behaviour with the reintroduced sfAutoloadAgain autoloader, which checked the return value for strings, and got instances, causing an infinite loop that made apache segmentation fault.</p>
<p>This is now fixed, by <a href="http://trac.symfony-project.org/changeset/22248" title="http://trac.symfony-project.org/changeset/22248">http://trac.symfony-project.org/cha&#8230;</a>, but was the feature worth the hassle? How many projects can this kind of change break?</p>
<p>So for all you that work on big projects, think well, then think again, then don&#8217;t do such a change. Usual formula says «With great power comes great responsibilities». I&#8217;d add «Great notoriety induce great responsibilities».</p>
<p>Yes millions of people uses PHP, and that&#8217;s the main reason why stable branch should stay stable. Rock solid stable.<br />
And it&#8217;s the same reason why symfony branches stay stable, as much as possible. And any exception to this always have bad feedback.</p>
<p>(thanks to <a href="http://blog.thepimp.net/">Pierre Joye</a> for his reminder at <a href="http://news.php.net/php.internals/45628" title="http://news.php.net/php.internals/45628">http://news.php.net/php.internals/4&#8230;</a>)</p>
<p><em><strong>Note</strong>: Software stability does not only mean bug-free. It also means «not changing», and it&#8217;s the main definition used there. Bugs are annoying, but they can be fixed to get the wanted behavior back, so it&#8217;s not a problem. And the only wanted behavior of a stable piece of software is the behavior it always had.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://symforc.com/2009/09/23/all-about-backward-compatibility/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Some sfDynamics&#160;news&#8230;</title>
		<link>http://symforc.com/2009/09/20/some-sfdynamics-news/</link>
		<comments>http://symforc.com/2009/09/20/some-sfdynamics-news/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 21:30:00 +0000</pubDate>
		<dc:creator>Romain Dorgueil</dc:creator>
				<category><![CDATA[plugin]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[roadmap]]></category>
		<category><![CDATA[sfDynamics]]></category>
		<category><![CDATA[trackeet]]></category>

		<guid isPermaLink="false">urn:md5:53361f40c5771f4a3941ba3a3de75067</guid>
		<description><![CDATA[Long time no see&#8230;
I&#8217;m very happy to get more and more comments and feedback about sfDynamics. I sure know it&#8217;s not perfect, but seeing it&#8217;s really usefull for other people than me and my colleagues is rewarding.
But I&#8217;ve also been so busy lately that I did very few writing and coding work around it, so [...]]]></description>
			<content:encoded><![CDATA[<p>Long time no see&#8230;</p>
<p>I&#8217;m very happy to get more and more comments and feedback about sfDynamics. I sure know it&#8217;s not perfect, but seeing it&#8217;s really usefull for other people than me and my colleagues is rewarding.</p>
<p>But I&#8217;ve also been so busy lately that I did very few writing and coding work around it, so I&#8217;ll write about last months work, and about the future road-map.</p>
<pre></pre>
<ul>
<li>I moved all my plug-ins ticketing from their different homes (lighthouse for sfDynamics, and symfony-project&#8217;s trac for the others) to a brand new redmine instance I set up on <a href="http://trackeet.org/">trackeet.org</a>. This will greatly enhance how I can see the issue list, prioritize and assign different stuff to people willing to help. Additionally, it helps cleaning up symfony-project&#8217;s trac instance which suffers from plug-in issues since a long time.</li>
<li>I fixed the easiest issues, and they&#8217;re packaged into the 0.9.4 release.</li>
<li>Since 0.9.2 release, we don&#8217;t support anymore symfony 1.1, as the routing system was radically different and way less power-full.</li>
<li>After I released 0.9.4 this week, next step will be a documentation clean-up, and some tutorial writing. Yes, the fourth part is still missing, and it will come to life very soon.</li>
<li>Upcoming 1.0 release will support symfony 1.2, 1.3, and 1.4. The aim for this release is to fix all 0.9 tickets that are not radically new features. A refactoring session before the first 1.0 release will be planned.</li>
<li>Next 1.1 version will at least support symfony 1.4, and if it&#8217;s possible 1.2 and 1.3 too. But the main goal will be to stick to the next LTS symfony version, which will be 1.4.</li>
</ul>
<p>I know, no dates were given on this page, but the new <a href="http://trackeet.net/projects/roadmap/sf-dynamics-plugin" hreflang="fr">roadmap page</a> solves this.</p>
<p>Some more news soon&#8230;</p>
<ul>
<li><a href="http://dynamics.dakrazy.net/" hreflang="en">sfDynamics homepage &amp; documentation</a></li>
<li><a href="http://trackeet.net/projects/sf-dynamics-plugin/issues" hreflang="en">sfDynamics issues</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://symforc.com/2009/09/20/some-sfdynamics-news/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The first sfDynamicsPlugin beta is&#160;out!</title>
		<link>http://symforc.com/2009/04/06/the-first-sfdynamicsplugin-beta-is-out/</link>
		<comments>http://symforc.com/2009/04/06/the-first-sfdynamicsplugin-beta-is-out/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 21:48:00 +0000</pubDate>
		<dc:creator>Romain Dorgueil</dc:creator>
				<category><![CDATA[annoucement]]></category>
		<category><![CDATA[assets]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">urn:md5:9b7d921cfab1f2148d2172043097bf43</guid>
		<description><![CDATA[After a long alpha development stage, I released this morning the first BETA
version of sfDynamicsPlugin. But&#8230; You may wonder, what is that?
sfDynamicsPlugin is a flexible assets manager for symfony which can be used to
manage javascript libraries and their associated stylesheets. It supports
packing, and CSS minifying, while keeping the full readable source in development
environment.
Finally out
After more [...]]]></description>
			<content:encoded><![CDATA[<p>After a long alpha development stage, I released this morning the first BETA<br />
version of sfDynamicsPlugin. But&#8230; You may wonder, what is that?</p>
<p>sfDynamicsPlugin is a flexible assets manager for symfony which can be used to<br />
manage javascript libraries and their associated stylesheets. It supports<br />
packing, and CSS minifying, while keeping the full readable source in development<br />
environment.</p>
<h2>Finally out</h2>
<p>After more than one year of thinkings about the right way to manage<br />
dependencies and relations between dynamic components, and a few months of<br />
intermitent coding, I&#8217;m proud to present sfDynamicsPlugin.</p>
<p><a href="http://www.symfony-project.org/plugins/sfDynamicsPlugin" hreflang="en">Look at the plugin&#8217;s page at symfony project</a></p>
<p>Features at a glance:</p>
<ul>
<li>JS framework agnostic</li>
<li>Built-in assets cache/supercache</li>
<li>Flexible XML configuration of packages</li>
<li>Dependencies/conflict management</li>
<li>Ease of use within plugins without repeating JS code</li>
<li>Built-in configuration for the most used frameworks including jQuery, jQuery UI, ExtJS, Prototype and Scriptaculous.</li>
</ul>
<h2>Use what you like</h2>
<p>To give some more details about the last feature, those are bundled as<br />
non-default configuration files, that you may, if you want, import in your<br />
project/app/plugin dynamics configuration file.</p>
<p>By doing so, there is absolutely no parsing overhead, as unused configuration<br />
files will be, he, unused.</p>
<h2>Documentation, documentation and even more documentation!</h2>
<p>As documentation is very important, full documentation is available both in<br />
markdown and HTML versions, along with a<br />
<a href="http://dynamics.dakrazy.net/documentation/tutorial-01_getting_started" hreflang="en">tutorial</a><br />
and a <a href="http://dynamics.dakrazy.net/example/jquery/000-hello-world" hreflang="en">short hello world</a> example.</p>
<ul>
<li><a href="http://dynamics.dakrazy.net/documentation/tutorial-01_getting_started" hreflang="en">Give me the tutorial</a></li>
<li><a href="http://dynamics.dakrazy.net/" hreflang="en">Take a look at the full HTML documentation</a></li>
<li><a href="http://github.com/hartym/sfdynamicsplugin/tree/30e524b3a7a711ee3dbd3460001e10d9f3c15b29/doc" hreflang="en">I&#8217;m a warrior, give me the MarkDown</a></li>
</ul>
<h2>Reporting bugs, suggesting features</h2>
<p>We use <a href="http://dynamics.lighthouseapp.com/dashboard" hreflang="en">lighthouseapp as our ticketing system</a>.<br />
Don&#8217;t hesitate to report bugs, we&#8217;re looking forward to make this plugin a<br />
«YFast» answer to highly dynamic websites.</p>
<p><a href="http://dynamics.lighthouseapp.com/dashboard" hreflang="en">Ok, show me the issues&#8230;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://symforc.com/2009/04/06/the-first-sfdynamicsplugin-beta-is-out/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to render a component in an action with symfony&#160;1.1+</title>
		<link>http://symforc.com/2009/03/12/how-to-render-a-component-in-an-action-with-symfony-1-1/</link>
		<comments>http://symforc.com/2009/03/12/how-to-render-a-component-in-an-action-with-symfony-1-1/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 12:34:00 +0000</pubDate>
		<dc:creator>Romain Dorgueil</dc:creator>
				<category><![CDATA[action]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[discussion]]></category>
		<category><![CDATA[render]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">urn:md5:8f937106a5989410ef4cdbf57abc11f2</guid>
		<description><![CDATA[public function executeBarfoo&#40;sfWebRequest $request&#41;
&#123;
&#160; return $this-&#62;renderComponent&#40;'my_module', 'my_component', array&#40;&#41;&#41;;
&#125;
This is an attempt to take over the first place on google for the query how to render component action symfony.
]]></description>
			<content:encoded><![CDATA[<div class="code"><code class="php">public <span style="color: #000000; font-weight: bold;">function</span> executeBarfoo<span style="color: #66cc66;">&#40;</span>sfWebRequest <span style="color: #0000ff;">$request</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#123;</span><br />
&nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">renderComponent</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'my_module'</span>, <span style="color: #ff0000;">'my_component'</span>, <a target="_blank" href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></code></div>
<p>This is an attempt to take over the first place on google for the query how to render component action symfony.</p>
]]></content:encoded>
			<wfw:commentRss>http://symforc.com/2009/03/12/how-to-render-a-component-in-an-action-with-symfony-1-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Foreign key&#8217;s onDelete for&#160;dummies</title>
		<link>http://symforc.com/2008/07/10/foreign-keys-ondelete-for-dummies/</link>
		<comments>http://symforc.com/2008/07/10/foreign-keys-ondelete-for-dummies/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 21:55:00 +0000</pubDate>
		<dc:creator>Romain Dorgueil</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[propel]]></category>

		<guid isPermaLink="false">urn:md5:2e49ed06a0bba3a3d2459d21260ff73d</guid>
		<description><![CDATA[Any modern relational database engine supports the onDelete and onUpdate attributes on foreign keys. Propel and Doctrine of
course allows to define it in the schema file (yaml or xml) and I believe it is important to explicitly set it.
Restrict mode
«Better do nothing than something stupid.»
The default behaviour is ON DELETE RESTRICT. This is the most [...]]]></description>
			<content:encoded><![CDATA[<p>Any modern relational database engine supports the onDelete and onUpdate attributes on foreign keys. Propel and Doctrine of<br />
course allows to define it in the schema file (yaml or xml) and I believe it is important to explicitly set it.</p>
<h2>Restrict mode</h2>
<p>«Better do nothing than something stupid.»</p>
<p>The default behaviour is <em>ON DELETE RESTRICT</em>. This is the most secure setting, so it is normal to have it as default.</p>
<p>If we try to <em>DELETE</em> a record referenced by the current object, the database engine just raise an SQL error. If it was not<br />
an error to <em>DELETE</em> this, you will have to start by removing the linked object, or setting the foreign key value to something different.</p>
<h2>Cascade mode</h2>
<p>«No need to keep obsolete things.»</p>
<p>But our database engines are able to do better. For example, if you have an user&#8217;s settings table and you delete an user, you may not wan&#8217;t<br />
to keep his settings. You just set <em>ON DELETE CASCADE</em> on user&#8217;s setting foreign key column referencing the user table, and if a user is ever deleted, all his associated properties will be destroyed.</p>
<p>Along with <em>ON DELETE CASCADE</em>, we usually add a NOT NULL constraint (or required: true), as the existence of current object is directly<br />
related to the existence of linked object. This may be wrong from time to time, but it is usually the case.</p>
<h2>Set null mode</h2>
<p>«We don&#8217;t rely on this. Just forget it.»</p>
<p>The last behavior is the <em>ON DELETE SET NULL</em> option. It does exactly what it says. If linked object is removed, we set our foreign key<br />
value to null.</p>
<p>This the behavior you may want to use for articles having a link to their author for example. If the author is removed from database,<br />
we don&#8217;t want to delete his articles, so we just loose the author information (well ok, this is a simplification, but it basically shows<br />
the idea).</p>
<h2>Why I think we should explicitly use it</h2>
<p>The default database engine behavior is «I don&#8217;t know how to handle it». Setting it will add power to your database model, while taking<br />
profit of your RDBMS features. Not setting it is like saying «I don&#8217;t know which way I want my database to behave in case we delete a linked<br />
object», and that&#8217;s like saying «I don&#8217;t know how I want my model to react». Thinking a little to understand which way you want it to work<br />
will make you certain you&#8217;re understanding the behavior you need in your project.</p>
<h2>How to set it in your favorite ORM:</h2>
<h3>schema.yml with Doctrine</h3>
<pre>
Article:
  columns:
    title:   string(255)
    body:    string(4096)
    user_id: integer(4)
  relations:
    User:
      onDelete: CASCADE
</pre>
<h3>PHP model with Doctrine</h3>
<div class="code"><code class="php">public <span style="color: #000000; font-weight: bold;">function</span> setUp<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#123;</span><br />
&nbsp; <span style="color: #0000ff;">$this</span>-&gt;<span style="color: #006600;">hasOne</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'User'</span>, <a target="_blank" href="http://www.php.net/array"><span style="color: #000066;">array</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'local'</span>&nbsp; &nbsp; =&gt; <span style="color: #ff0000;">'user_id'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'foreign'</span>&nbsp; =&gt; <span style="color: #ff0000;">'id'</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'onDelete'</span> =&gt; <span style="color: #ff0000;">'CASCADE'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></code></div>
<h3>schema.yml with Propel</h3>
<pre>
    data_id:  { type: integer, primaryKey: true, foreignTable: data, foreignReference: id, onDelete: cascade, onUpdate: cascade }
</pre>
<h3>schema.xml with Propel</h3>
<div class="code"><code class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;foreign</span>-key <span style="color: #000066;">foreignTable</span>=<span style="color: #ff0000;">&quot;data&quot;</span> onDelete = <span style="color: #ff0000;">&quot;setnull&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;reference</span> <span style="color: #000066;">local</span>=<span style="color: #ff0000;">&quot;data_id&quot;</span> <span style="color: #000066;">foreign</span>=<span style="color: #ff0000;">&quot;id&quot;</span> <span style="font-weight: bold; color: black;">/&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/foreign</span>-key<span style="font-weight: bold; color: black;">&gt;</span></span></code></div>
]]></content:encoded>
			<wfw:commentRss>http://symforc.com/2008/07/10/foreign-keys-ondelete-for-dummies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony 1.1 is out, and the winner is&#8230;&#160;1.2!</title>
		<link>http://symforc.com/2008/07/01/symfony-1-1-is-out-and-the-winner-is-1-2/</link>
		<comments>http://symforc.com/2008/07/01/symfony-1-1-is-out-and-the-winner-is-1-2/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 21:52:00 +0000</pubDate>
		<dc:creator>Romain Dorgueil</dc:creator>
				<category><![CDATA[1.1]]></category>
		<category><![CDATA[1.2]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">urn:md5:85f53cbd1b862e7ec8d83c276fe0c581</guid>
		<description><![CDATA[The longly awaited 1.1 version is finally out after long months of development. After doing this, Fabien started the 1.2 branch, and you can take a look at that magnificient revision which for sure opens a new era of symfony developments.
A lot of nice new features are greatly awaited in the next version.
First of all, [...]]]></description>
			<content:encoded><![CDATA[<p>The longly awaited 1.1 version is finally out after long months of development. After doing this, Fabien started the 1.2 branch, and you can take a look at <a href="http://trac.symfony-project.com/changeset/10000" hreflang="fr">that magnificient revision</a> which for sure opens a new era of symfony developments.</p>
<p>A lot of nice new features are greatly awaited in the next version.</p>
<p>First of all, the admin generator will be completely rewritten, to make a good use of the new form framework. That will for sure open incredible new possibilities and remove the permanent need for hacks to customize your own admin interface (or frontend interface, if you do use admin generation in frontend too). At least, the first one amazed more than one person, and we can be pretty sure that new version will kick asses.</p>
<p>Some people were complaining about Ruby on Rails having a great advantage over symfony, by their deployment tool Capistrano, while symfony only allow to rsync to one server. Hopefully this won&#8217;t be true for long anymore. For information, Capistrano allows to create real deployment scripts, like &#8220;Disable frontend app on this server, make backups of site and database, synchronize, remotely run tests, clear the cache and enable the frontend app&#8221;. That will easify a lot our projects delivery procedures.</p>
<p>Amongst some other details, the last major point Symfony 1.2 will see is some further decoupling of the technical choices symfony 1.0  gave us, like Propel or Prototype. Prototype and the helpers will still be bundled with symfony, but as a plugin, like Propel is since 1.1. This is very important IMHO, because symfony should never force any technical choice to the teams. But many people complained that helpers was one of the easy and magic things that attract newcomers to symfony. The plugin solution is keeping everyone happy. In the same spirit, symfony 1.2 will bundle the sfDoctrine plugin thanks to Jonathan Wage work to stabilise and manage branches/features.</p>
<p>And for the short term, the unpublished chapters of the form framework online book are still to come too, along with a symfony 1.1 &#8220;First project&#8221; tutorial.</p>
<p>Long life to symfony <img src='http://symforc.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://symforc.com/2008/07/01/symfony-1-1-is-out-and-the-winner-is-1-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Towards symfony&#160;1.1</title>
		<link>http://symforc.com/2008/06/16/towards-symfony-1-1/</link>
		<comments>http://symforc.com/2008/06/16/towards-symfony-1-1/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 21:55:00 +0000</pubDate>
		<dc:creator>Romain Dorgueil</dc:creator>
				<category><![CDATA[1.1]]></category>
		<category><![CDATA[discussion]]></category>
		<category><![CDATA[documentation]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[upgrade]]></category>

		<guid isPermaLink="false">urn:md5:a03732439a4dea12611b213272b2c593</guid>
		<description><![CDATA[After more than one year since symfony 1.0 was released, symfony 1.1 goes more and more mature each day. Recent RC releases are a proof of it, but many people are still concerned about whether or not they should migrate.
Documentation?
Many people are complaining about the fact it lacks documentation. In fact, it seems that many [...]]]></description>
			<content:encoded><![CDATA[<p>After <a href="http://www.symfony-project.org/blog/2007/02/19/symfony-1-0-released" hreflang="en" title="Symfony 1.0 release">more than one year</a> since symfony 1.0 was released, symfony 1.1 goes more and more mature each day. Recent RC releases are a proof of it, but many people are still concerned about whether or not they should migrate.</p>
<h3>Documentation?</h3>
<p>Many people are complaining about the fact it lacks documentation. In fact, it seems that many people fears that because François <a href="http://redotheweb.com/2008/05/16/no-one-is-irreplaceable/" hreflang="en" title="François Zaninotto leaves symfony core team">announced he was leaving the symfony core team</a>, nobody would take care of documenting the project.</p>
<p>But that&#8217;s something any big open-source project come to see one day, a former or important team member leaves the project, because he or she doesn&#8217;t have anymore time for it, differ views, change interest, or whatever else.</p>
<p>As he said, no-one is irreplaceable, and new people comes in too, hopefully. Developpers from many countries started recently to fix and translate existing documentation for symfony 1.1, a new mailing list is being created for documentors and the symfony core team is currently putting a great effort on it too.</p>
<h3>Documentation!</h3>
<p>The symfony documentation page is split by version and language, and the 1.1 english version is getting attention to adapt parts of it in the need. But even without that, if you know symfony 1.0 pretty well, you should not have hard time to updating, as every changed part were because they were judged too complex, or not &#8220;clean&#8221; enough. The new way to do things is usually easier.</p>
<p>To demonstrate it, people from symfony core team published a little serie of articles on symfony-project.org recently:</p>
<ul>
<li><a href="http://www.prendreuncafe.com" hreflang="fr" title="Prendre un café, blog de Nicolas Perriault">Nicolas Perriault</a> published an article about <a href="http://www.symfony-project.org/blog/2008/06/12/internationalize-your-propel-forms">form internationalization</a>, something you could not do to do so easily with symfony 1.0 helpers.</li>
<li><a href="http://www.aide-de-camp.org/" title="Aide de Camp, Fabien Potencier">Fabien Potencier</a> demonstrated <a href="http://www.symfony-project.org/blog/2008/06/09/how-to-create-an-optimized-version-of-your-website-for-the-iphone-in-symfony-1-1" hreflang="en" title="How to create an optimized version of your website for the iphone in symfony 1.1">how handy was the new sf_format feature</a>, to provide the same logical content within different formats, or for instance, different views. He also explained <a href="http://www.symfony-project.org/blog/2008/06/09/how-to-customize-the-directory-structure-in-symfony-1-1" hreflang="en" title="how to customize a project&#039;s directory structure">how to customize a project&#8217;s directory structure</a>, showing the use of ApplicationConfiguration and ProjectConfiguration classes.</li>
<li><a href="http://www.carlsoft.net/" hreflang="en" title="Carl&#039;s homepage">Carl Vondrick</a> explained <a href="http://www.symfony-project.org/blog/2008/05/30/how-do-i-use-propel-1-3-in-symfony-1-1" hreflang="en" title="How to use Propel 1.3 in symfony 1.1">how to use Propel 1.3 to boost your ORM layer performances</a> (be aware though that PHP 5.2 is needed, while symfony 1.1 only requires PHP 5.1.4).</li>
<li><a href="http://dakrazy.net" hreflang="en" title="Romain Dorgueil&#039;s homepage">I</a> published two little tutorials about <a href="http://www.symfony-project.org/blog/2008/06/10/how-to-send-emails-in-symfony-1-1" hreflang="en" title="How to send emails in symfony 1.1">sending emails</a> and <a href="http://www.symfony-project.org/blog/2008/06/14/batches-are-dead-long-life-to-tasks" hreflang="en" title="Batches are dead, long life to tasks">using tasks</a>.</li>
</ul>
<p>And more are to come, of course!</p>
<h3>And about forms?</h3>
<p>The only part of symfony which needs a bit of learning is the new form framework, which is quite radically different from the 1.0 way to create form. And about this, Fabien recently announced he will <a href="http://www.symfony-project.org/blog/2008/06/06/documentation-updates" hreflang="en" title="The article in which Fabien announces the publication of a book dedicated to symfony 1.1 forms">publish an entire book about it</a>.</p>
<h3>To migrate or not to migrate</h3>
<p>Symfony 1.0 is Long Term Support version, which means that symfony team will go on fixing bugs for three years since the original release. If your project is nearly released or already released, I would not bother upgrading, because you would not benefit of symfony 1.1 new features, while you&#8217;d suffer the upgrade process.</p>
<p>On the other hand, if your project is very young, I think the time to take the step is now, the official 1.1 release being real soon. You&#8217;d benefit of all new features with a very active community and a very reactive development team.</p>
]]></content:encoded>
			<wfw:commentRss>http://symforc.com/2008/06/16/towards-symfony-1-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
