<?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>CakePHP Brasil &#187; CakePHP</title>
	<atom:link href="http://blog.cakephp-brasil.org/tag/cakephp/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.cakephp-brasil.org</link>
	<description>O blog público para desenvolvedores CakePHP.</description>
	<lastBuildDate>Thu, 29 Jul 2010 01:05:51 +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>Virando a página &#8211; Cake 2.0</title>
		<link>http://blog.cakephp-brasil.org/2010/07/16/virando-a-pagina-cake-2-0/</link>
		<comments>http://blog.cakephp-brasil.org/2010/07/16/virando-a-pagina-cake-2-0/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 22:44:52 +0000</pubDate>
		<dc:creator>Juan Basso</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://blog.cakephp-brasil.org/?p=127</guid>
		<description><![CDATA[Agora que o CakePHP 2.0 já está um pouco mais maduro, vou comentar um pouco sobre a nova versão, daqui pra frente pretendo publicar alguns posts mais detalhado de cada novo recurso, por enquanto vamos numa visão mais macro.
Pra começo de conversa, pra quem não sabe o CakePHP 2.0 é a versão que está em [...]]]></description>
			<content:encoded><![CDATA[<p>Agora que o CakePHP 2.0 já está um pouco mais maduro, vou comentar um pouco sobre a nova versão, daqui pra frente pretendo publicar alguns posts mais detalhado de cada novo recurso, por enquanto vamos numa visão mais macro.</p>
<p>Pra começo de conversa, pra quem não sabe o CakePHP 2.0 é a versão que está em desenvolvimento pelo time do cake. As versões 1.2 e 1.3 são versões estáveis e que daqui para frente só terão correções de bugs, nada de recurso novo. Não há em vista uma versão 1.4 (que seriam novos recursos com compatibilidade pro PHP4).</p>
<p>A versão 2.0 tem como requisito PHP 5.2 em diante. Por este fato, trará muitos recursos novos e facilidades no desenvolvimento das aplicações. Além disso, a versão poderá otimizar muitos itens, tornando a sua aplicação mais rápida ainda.</p>
<p>Alguns itens previstos pro Cake 2.0:</p>
<ul>
<li>Fim da compatibilidade com PHP 4</li>
<li>Lazy load para models, helpers e componentes (Não sabe o que é? Eu explico eu outro post)</li>
<li>Remover a &#8220;mágica&#8221; que mudava os textos, adotando o &#8220;<em>What you type is what you get</em>&#8221; (ou &#8220;O que você escrever é o que você verá&#8221;).</li>
<li>Ajustes do código para utilizar classes Spl, interfaces, abstracts, etc. e corrigir a visibilidade dos métodos (public/private/protected)</li>
<li>As buscas retornarão objetos e não mais arrays, facilitando ações e aumentando a performance</li>
<li>Helpers, Behaviors e Components poderão ter aliases, ou seja, você poderá fazer seu próprio HtmlHelper e dizer que o helper Html será o seu customizado</li>
</ul>
<p>Gostou? Essa era só uma palinha sobre o que vem por aí. Em breve mais comentários e detalhes sobre o funcionamento destes itens.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cakephp-brasil.org/2010/07/16/virando-a-pagina-cake-2-0/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Behavior Super Find veio ao mundo</title>
		<link>http://blog.cakephp-brasil.org/2010/04/27/behavior-super-find-veio-ao-mundo/</link>
		<comments>http://blog.cakephp-brasil.org/2010/04/27/behavior-super-find-veio-ao-mundo/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 21:49:59 +0000</pubDate>
		<dc:creator>Juan Basso</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[behavior]]></category>
		<category><![CDATA[superfind]]></category>

		<guid isPermaLink="false">http://blog.cakephp-brasil.org/?p=118</guid>
		<description><![CDATA[Depois de ter criado o post sobre o Behavior para melhorar o find, cá está ele! Ontem a noite criei o projeto e enviei o código que tenho para o GitHub, no projeto entitulado de super_find.
Tinha dito que o nome seria power find, mas depois de ver alguns projetos na internet como o SuperAuth, SuperValidatable, [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de ter criado o post sobre o <a href="http://blog.cakephp-brasil.org/2010/04/22/behavior-para-melhorar-o-find/">Behavior para melhorar o find</a>, cá está ele! Ontem a noite criei o projeto e enviei o código que tenho para o GitHub, no projeto entitulado de <a href="http://github.com/jrbasso/super_find">super_find</a>.</p>
<p>Tinha dito que o nome seria power find, mas depois de ver alguns projetos na internet como o <a href="http://github.com/Theaxiom/SuperAuth">SuperAuth</a>, <a href="http://github.com/tPl0ch/cakephp-super-validatable-plugin">SuperValidatable</a>, etc., resolvi manter o nome de SuperFind.</p>
<p>Bem, vamos ao que interessa, o que faz e como funciona&#8230; Basicamente, ele serve para fazer um find podendo colocar condições de relacionamentos hasMany e HABTM. No CakePHP puro isto não é possível, pois ele joga estas condições na query direto e acaba causando um erro de SQL. Aí você dizer, mas e o Containable?! Bem, ele até faz alguns filtros, mas o filtro que ele faz é em cima do valor retornado da consulta principal. Vamos a um exemplo:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p118code2'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1182"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code" id="p118code2"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Usuario</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'all'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'contain'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Tarefa.nome = &quot;Tarefa 1&quot;)));
/* Retorno:
    array(
        array(
            '</span>Usuario<span style="color: #0000ff;">' =&gt; array('</span>id<span style="color: #0000ff;">' =&gt; 1, '</span>nome<span style="color: #0000ff;">' =&gt; '</span>Usuario <span style="color: #cc66cc;">1</span><span style="color: #0000ff;">'),
            '</span>Tarefa<span style="color: #0000ff;">' =&gt; array(
                array('</span>id<span style="color: #0000ff;">' =&gt; 1, '</span>nome<span style="color: #0000ff;">' =&gt; '</span>Task <span style="color: #cc66cc;">1</span><span style="color: #0000ff;">', '</span>usuario_id<span style="color: #0000ff;">' =&gt; 1)
            )
        ),
        array(
            '</span>Usuario<span style="color: #0000ff;">' =&gt; array('</span>id<span style="color: #0000ff;">' =&gt; 2, '</span>nome<span style="color: #0000ff;">' =&gt; '</span>Usuario <span style="color: #cc66cc;">2</span><span style="color: #0000ff;">'),
            '</span>Tarefa<span style="color: #0000ff;">' =&gt; array(
            )
        ),
        array(
            '</span>Usuario<span style="color: #0000ff;">' =&gt; array('</span>id<span style="color: #0000ff;">' =&gt; 3, '</span>nome<span style="color: #0000ff;">' =&gt; '</span>Usuario <span style="color: #cc66cc;">3</span><span style="color: #0000ff;">'),
            '</span>Tarefa<span style="color: #0000ff;">' =&gt; array(
            )
        ),
    )
*/
&nbsp;
$this-&gt;Usuario-&gt;superFind('</span>all<span style="color: #0000ff;">', array('</span>conditions<span style="color: #0000ff;">' =&gt; array('</span>Tarefa<span style="color: #339933;">.</span>nome<span style="color: #0000ff;">' =&gt; '</span>Tarefa <span style="color: #cc66cc;">1</span><span style="color: #0000ff;">')));
/* Retorna:
    array(
        array(
            '</span>Usuario<span style="color: #0000ff;">' =&gt; array('</span>id<span style="color: #0000ff;">' =&gt; 1, '</span>nome<span style="color: #0000ff;">' =&gt; '</span>Usuario <span style="color: #cc66cc;">1</span><span style="color: #0000ff;">'),
            '</span>Tarefa<span style="color: #0000ff;">' =&gt; array(
                array('</span>id<span style="color: #0000ff;">' =&gt; 1, '</span>nome<span style="color: #0000ff;">' =&gt; '</span>Tarefa <span style="color: #cc66cc;">1</span><span style="color: #0000ff;">', '</span>usuario_id<span style="color: #0000ff;">' =&gt; 1)
            )
        )
    )
*/</span></pre></td></tr></table></div>

<p>Em resumo, no Containable ele listou todos os usuários e no relacionamento <em>Tarefa</em> veio apenas os que tinham a &#8216;Tarefa 1&#8242;. Já no SuperFind ele mostrou apenas os usuários que tinham a &#8216;Tarefa 1&#8242;.</p>
<p>O mesmo funciona com relacionamentos HABTM. Para os relacionamentos hasOne e belongsTo não são necessários, pois isto já funciona nativamente.</p>
<p>Por enquanto é possível fazer isto apenas com um nível de filtro, ou seja, você não poderá colocar nas condições algo como <em>Tarefa.Projeto.nome</em>.</p>
<p>Bem, por enquanto é isso. Alguém tem mais sugestões do que poderia entrar? O que sente falta no find?</p>
<p>Abraços e bom uso.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cakephp-brasil.org/2010/04/27/behavior-super-find-veio-ao-mundo/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Nova release do CakePHP</title>
		<link>http://blog.cakephp-brasil.org/2010/04/23/nova-release-do-cakephp/</link>
		<comments>http://blog.cakephp-brasil.org/2010/04/23/nova-release-do-cakephp/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 11:22:18 +0000</pubDate>
		<dc:creator>Juan Basso</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://blog.cakephp-brasil.org/2010/04/23/nova-release-do-cakephp/</guid>
		<description><![CDATA[Hoje foi liberada a release 1.2.7 do CakePHP, corrigindo 36 bugs, sendo um uma questão de segurança.
Uma pequena correção de segurança também foi feita nesta versão. Este problema de segurança afeta apenas os sistemas que utilizam o modo debug em produção. Caso deseja apenas corrigir o problema de segurança, sem atualizar o core inteiro, você [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje foi liberada a release 1.2.7 do CakePHP, corrigindo 36 bugs, sendo um uma questão de segurança.</p>
<p>Uma pequena correção de segurança também foi feita nesta versão. Este problema de segurança afeta apenas os sistemas que utilizam o modo debug em produção. Caso deseja apenas corrigir o problema de segurança, sem atualizar o core inteiro, você pode aplicar o patch disponibilzado por eles em <a href="http://bin.cakephp.org/view/1459556460">http://bin.cakephp.org/view/1459556460</a>.</p>
<p>A nova versão (1.2.7) está disponível no <a href="http://github.com/cakephp/cakephp1x/downloads">GitHub</a>. A lista completa das alterações pode ser vista no <a href="http://cakephp.lighthouseapp.com/projects/42648/changelog-1-2-7">Changelog</a>.</p>
<p>Lembro também que está previsto para domingo o lançamento da versão 1.3.0-RC5! Vamos aguardar pra ver.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cakephp-brasil.org/2010/04/23/nova-release-do-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Behavior para melhorar o find</title>
		<link>http://blog.cakephp-brasil.org/2010/04/22/behavior-para-melhorar-o-find/</link>
		<comments>http://blog.cakephp-brasil.org/2010/04/22/behavior-para-melhorar-o-find/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 22:14:08 +0000</pubDate>
		<dc:creator>Juan Basso</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[model]]></category>

		<guid isPermaLink="false">http://blog.cakephp-brasil.org/2010/04/22/behavior-para-melhorar-o-find/</guid>
		<description><![CDATA[Hola!
Estava aqui implementando alguns projetos e vi o quão chato é ter que implementar os models no cake sempre pensando nas queries que ele irá gerar.
As vezes vou fazer um find em models que tenham hasMany e quero fazer um filtro pelo model do hasMany e não consigo. Se eu coloco no conditions ele diz [...]]]></description>
			<content:encoded><![CDATA[<p>Hola!</p>
<p>Estava aqui implementando alguns projetos e vi o quão chato é ter que implementar os models no cake sempre pensando nas queries que ele irá gerar.</p>
<p>As vezes vou fazer um find em models que tenham hasMany e quero fazer um filtro pelo model do hasMany e não consigo. Se eu coloco no conditions ele diz que a tabela do hasMany não existe. Se eu uso Containable ele mostra todos os registros do model que fiz o find com alguns tendo associações vazias. Ou seja, ele não faz JOIN com as tabelas hasMany nesses casos, sempre gerar queries diferentes e não sabe tratar direito.</p>
<p>Pensei em implementar isto no core do cake e propor para eles, mas a release 1.3 está fechada para enhancements, então ficaria para a versão 1.4/2.0 que sabe-se lá quando vem&#8230; Pensei então em um plugin para implementar isto, mas aí entra meu maior problema em computação: qual o nome?! <img src='http://blog.cakephp-brasil.org/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Alguém tem alguma sugestão? Como será um projeto a nível internacional, pensei em &#8220;SuperFind&#8221;, &#8220;FindPlusPlus&#8221;, &#8220;xFind&#8221;&#8230; Alguém tem alguma melhor?</p>
<p>No começo será mais para melhorar os relacionamentos de joins e afins, mas futuramente trabalhar melhor um pouco os casos de limit nos relacionamentos e outras coisitas a mais do find.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cakephp-brasil.org/2010/04/22/behavior-para-melhorar-o-find/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Finalmente a release: CakePHP 1.2!</title>
		<link>http://blog.cakephp-brasil.org/2008/12/26/finalmente-a-release-cakephp-12/</link>
		<comments>http://blog.cakephp-brasil.org/2008/12/26/finalmente-a-release-cakephp-12/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 16:06:31 +0000</pubDate>
		<dc:creator>Juan Basso</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://blog.cakephp-brasil.org/2008/12/26/finalmente-a-release-cakephp-12/</guid>
		<description><![CDATA[Pessoal, como presente de natal tivemos a chegada da release 1.2 tão esperada por muitos do CakePHP.
Os detalhes podem ser vistos em http://bakery.cakephp.org/articles/view/the-gift-of-1-2-final.
Abraços e bons projetos a todos.
]]></description>
			<content:encoded><![CDATA[<p>Pessoal, como presente de natal tivemos a chegada da release 1.2 tão esperada por muitos do CakePHP.<br />
Os detalhes podem ser vistos em <a href="http://bakery.cakephp.org/articles/view/the-gift-of-1-2-final" target="_blank">http://bakery.cakephp.org/articles/view/the-gift-of-1-2-final.</a></p>
<p>Abraços e bons projetos a todos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cakephp-brasil.org/2008/12/26/finalmente-a-release-cakephp-12/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Benchmarks entre frameworks PHP</title>
		<link>http://blog.cakephp-brasil.org/2008/12/25/benchmarks-entre-frameworks-php/</link>
		<comments>http://blog.cakephp-brasil.org/2008/12/25/benchmarks-entre-frameworks-php/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 18:40:43 +0000</pubDate>
		<dc:creator>Juan Basso</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[code igniter]]></category>
		<category><![CDATA[comparação]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[yii]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://blog.cakephp-brasil.org/?p=76</guid>
		<description><![CDATA[Pessoal,
 
Natal é legal para trocar presentes, unir família e tudo mais, mas isso dura algumas horas, nas demais ficamos sem ter o que fazer, até mesmo porque o comércio não abre. Com isso, resolvi fazer alguns testes nos principais frameworks PHP que estão no mercado: CakePHP, Code Igniter, Symfony, Yii e Zend Framework.
Todos os benchmarks [...]]]></description>
			<content:encoded><![CDATA[<p>Pessoal,</p>
<p> </p>
<p>Natal é legal para trocar presentes, unir família e tudo mais, mas isso dura algumas horas, nas demais ficamos sem ter o que fazer, até mesmo porque o comércio não abre. Com isso, resolvi fazer alguns testes nos principais frameworks PHP que estão no mercado: <a href="http://www.cakephp.org" target="_blank">CakePHP</a>, <a href="http://codeigniter.com/" target="_blank">Code Igniter</a>, <a href="http://www.symfony-project.org/" target="_blank">Symfony</a>, <a href="http://www.yiiframework.com/" target="_blank">Yii</a> e <a href="http://framework.zend.com/" target="_blank">Zend Framework</a>.</p>
<p>Todos os benchmarks que eu vejo pela internet são de um simples hello world, que às vezes não utilizam o framework como indicado e acaba desvirtuando um pouco. Além disso, muitos testam somente a versão estável, deixando pra lá algumas versões mais &#8220;quentes&#8221;, como no caso do CakePHP 1.2. Então resolvi mudar! Fiz um teste com o famoso Hello World, e outros dois: um acessando o banco de dados e lendo 10 registros e o mesmo código lendo 1000 registros. Assim, aproxima um pouco da realidade do desenvolvimento, pois não desenvolvemos Hello Worlds, mas sim acesso a banco, uso de MVC (completo e não como os exemplos que não há view!). Não testei as funcionalidades em si de cada framework como cache, ACL, componentes, etc, detive-me ao básico, acessar o banco e mostrar um dos campos.</p>
<p>Bem, vamos começar falando da máquina de testes. Estava rodando num Debian Etch, com processador Intel Xeon 2.66GHz, 256MB de RAM. Esta máquina é um servidor de produção que é vendido pela <a href="http://www.virtuaserver.com.br" target="_blank">VirtuaServer</a>. Ou seja, tentei fazer o teste num servidor que usamos na prática e não numa máquina local de qualquer desenvolvedor. Nesta máquina a versão do Apache é a 2.2.3, PHP 5.2.0 e MySQL 5.0.32. Nenhuma extensão de cache/performance (APC, Memcache, etc) está habilitada.</p>
<p>O desenvolvimento da aplicação eu fiz me baseando na documentação de cada framework e não a partir de exemplos prontos, pois queria fazer seguindo a lógica dos desenvolvedores de cada framework. Tentei deixar o mais próximo do modo de produção (desabilitando debugs, etc).</p>
<p>Vamos aos resultados, começando pelo famoso Hello World:</p>
<p><img class="aligncenter" title="Hello World" src="http://chart.apis.google.com/chart?cht=bhg&amp;chs=600x260&amp;chds=1,1700,1,1700&amp;chd=t:425,433,1480,325,1622,495|487,432,1598,345,1571,495&amp;chco=1410aa,aa143c&amp;chtt=Hello+World&amp;chdl=10+concorrências|100+concorrências&amp;chxt=x,y&amp;chxl=0:|0|340|680|1020|1360|1700|1:|Zend 1.7.2|Yii 1.0.0|Symfony 1.2.1|CodeIgniter 1.7.0|CakePHP 1.2 RC4|CakePHP 1.1.20&amp;chbh=10,3,10" alt="" width="600" height="260" /></p>
<p>O eixo Y representa o número de requisições completadas após 30 segundos de testes. Usei a ferramenta &#8220;<a href="http://httpd.apache.org/docs/1.3/programs/ab.html" target="_blank">ab</a>&#8221; para fazer os testes (parâmetros: -t 30 -c 10 ou -c 100. Isso significa que testei cada framework por 30 segundos, com 10 ou 100 requisições em paralelo).</p>
<p>Como podem ver, Yii e CodeIgniter apresentaram excelentes resultados, enquanto os demais ficaram próximos. Alguns poderiam dizer  que o CakePHP apresenta resultados inferiores por manter suporte ao PHP4, o que limita algumas coisas, mas lembro que o CodeIgniter também suporta o PHP4 e apresentou resultados surpreendentes.</p>
<p>PS: Fiz as aplicações antes de iniciar todos os testes, ou seja, a parte de banco de dados já estava configurada até para fazer o Hello World, então caberia a aplicação conectar/carregar &#8220;drivers&#8221; ou não&#8230;</p>
<p>Ok, agora vamos aos resultados dos testes dos frameworks acessando a base de dados e mostrando 10 registros:</p>
<p style="text-align: center; "><img class="aligncenter" title="Acessando 10 registros no banco de dados" src="http://chart.apis.google.com/chart?cht=bhg&amp;chs=600x260&amp;chds=1,1700,1,1700&amp;chd=t:483,302,966,319,836,441|467,293,991,312,791,374&amp;chco=1410aa,aa143c&amp;chtt=Acesso+Banco+de+dados|10+registros&amp;chdl=10+concorrências|100+concorrências&amp;chxt=x,y&amp;chxl=0:|0|340|680|1020|1360|1700|1:|Zend 1.7.2|Yii 1.0.0|Symfony 1.2.1|CodeIgniter 1.7.0|CakePHP 1.2 RC4|CakePHP 1.1.20&amp;chbh=10,3,10" alt="" width="600" height="260" /></p>
<p>Novamente Yii e CodeIgniter se sobressaindo&#8230; Porém, vejam que o CakePHP estável (1.1) obteve melhores resultados que o CakePHP 1.2 e mais, o CakePHP 1.2 obteve o pior resultados dos pesquisados.</p>
<p>Outra coisa interessante que podemos notar é que o CodeIgniter tem uma performance melhor com mais requisições em paralelo, sendo mais interessante para sites de grande porte, como portais que tem bastante acesso.</p>
<p>E agora o último teste: acesso ao banco com 1000 registros. A idéia deste teste é tentar visualizar se o framework tem um overhead grande por causa de registros ou por causa da pesquisa. Se pensarmos, a pesquisa é a mesma, a quantidade de registros retornados é que mudará, então é neste ponto que vamos notar as diferenças.</p>
<p style="text-align: center; "><img class="aligncenter" title="Acessando 1000 registros no banco de dados" src="http://chart.apis.google.com/chart?cht=bhg&amp;chs=600x260&amp;chds=1,1700,1,1700&amp;chd=t:259,243,787,223,490,402|254,244,754,230,497,398&amp;chco=1410aa,aa143c&amp;chtt=Acesso+Banco+de+dados|1000+registros&amp;chdl=10+concorrências|100+concorrências&amp;chxt=x,y&amp;chxl=0:|0|340|680|1020|1360|1700|1:|Zend 1.7.2|Yii 1.0.0|Symfony 1.2.1|CodeIgniter 1.7.0|CakePHP 1.2 RC4|CakePHP 1.1.20&amp;chbh=10,3,10" alt="" width="600" height="260" /></p>
<p style="text-align: left;">CodeIgniter novamente se destacando e ainda deixando o Yii mais distante que nos demais testes. Nota-se também que todos têm um overhead grande sobre os registros retornados no banco, pois diminuíram muito sua performance. O CakePHP 1.2 reduziu pouco, o que é interessante.</p>
<p style="text-align: left;">Vale ressaltar que o teste com 1000 registros não é tão usado na prática, pois uma página com 1000 registros pro usuário ler é um tanto quanto chato. Normalmente nestes casos há paginação. Exemplos práticos que vejo disto é na geração de relatório ou gráficos, mas que são pontos isolados e não tão usuais.</p>
<p style="text-align: left;">Alguns comentários sobre os desenvolvimentos das aplicações de teste:</p>
<ul>
<li>Do CakePHP eu não posso falar nada, pois já trabalho com ele a mais de dois anos. Os demais, desconhecia quase que totalmente;</li>
<li>O Zend Framework eu tive um trabalho imenso para conseguir fazer o banco de dados funcionar. Na documentação deles eles falaram várias coisas que podem ser feitas, mas não dizem a básica: aonde vão os arquivos;</li>
<li>No Zend eles recomendam que as requisições que só vão retornar textos simples seja feito no controller, por exemplo, na action do controller você coloca um die ou exit. Eu acho que isso quebra o MVC e em grandes projetos fica uma salada de fruta;</li>
<li>Ainda no Zend eles recomendam que os arquivos que não são de view (não teham HTML) você não feche a tag do PHP (?&gt;), assim evita que fiquem linhas em branco no arquivo e dê os famosos erros de não conseguir escrever no header. Ok, isso é legal, mas não fechar as tags eu acho que é amadorismo. Se o cara fechou e deixou uma linha em branco, é desatenção e deve ser corrigido e não contornado.</li>
<li>O Symfony eu não sei direito tudo que ele gerou, sei que eu executava alguns comandos (indicados na documentação) e ele fazia as coisas acontecerem. Não encontrei na documentação sobre a lógica e como desenvolver manualmente&#8230;</li>
<li>No Symfony, também tive problema em configurar o banco de dados, pois na documentação estava errada, mas em algumas pesquisas do Google eu achei;</li>
<li>O Yii parece fácil de usar. Ele tem certas similaridades com o CakePHP (exceto na performance, como foi visto);</li>
<li>Code Igniter também foi tranqüilo o desenvolvimento. A estrutura de diretórios é similar a do CakePHP, facilitando um pouco.</li>
</ul>
<p>Minhas opiniões quanto os resultados:</p>
<ul>
<li>CakePHP, Yii e CodeIgniter são fáceis de desenvolver, tem uma boa organização e estruturação, ficando legíveis e bons para se trabalhar em equipes diversificadas;</li>
<li>A documentação do Zend e Symfony são meio obscuras para &#8220;dummies&#8221;, tendo que quebrar um pouco a cabeça para conseguir fazer coisas simples (como o acesso ao banco).  Para quem está começando, acho que isso é um tanto quanto chato e desestimulante&#8230;</li>
<li>Yii e CodeIgniter parecem ter bom desempenho na prática, porém desconheço dos recursos e de como é a forma de desenvolvimento. Temos que ver se eles não são muito amarrados aos recursos internos e não dão suporte a integração com outras aplicações/componentes.  Entretanto, se eu fosse começar um desenvolvimento hoje, estudaria um pouco mais esses dois;</li>
<li>Yii é focado para web 2.0 e trabalha com <a href="http://jquery.com" target="_blank">jQuery</a> (que é a onda do momento em JavaScript). Interessante&#8230; Acho que se ele incorporar algumas funcionalidades mais comerciais (testes automatizados, etc) ele terá futuro promissor e não será um fogo de palha;</li>
<li>O CakePHP ainda parece o mais &#8220;potente&#8221; do mercado e tem uma boa visão comercial. Enquanto que a maioria se preocupa em fazer site &#8220;legal&#8221;, o CakePHP dá essa possibilidade e ao mesmo tempo oferece um suporte a desenvolvimento para empresas, com facilidades para desenvolvimento utilizando métodos ágeis, testes automatizados, etc.</li>
</ul>
<p>Bem, acho que é isso. Não vou largar do CakePHP, mas não custa dar uma estudada mais a fundo nos outros.</p>
<p>Caso alguém tenha alguma sugestão de testes a fazer, comente! Pois vou deixar minha suite de testes montada para quando sair novas versões fazer a comparação.</p>
<p>Caso queiram ver os testes mais detalhados, podem acessar os <a href="http://www.cakephp-brasil.org/benchmarks/resultados/final.html" target="_blank">últimos resultados dos testes</a>. Neste site também está disponível o resultado mais detalhado de cada teste, inclusive os números.</p>
<p> </p>
<p>Abraços.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cakephp-brasil.org/2008/12/25/benchmarks-entre-frameworks-php/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Nova versão do CakePHP no ar: RC4!</title>
		<link>http://blog.cakephp-brasil.org/2008/12/19/nova-versao-do-cakephp-no-ar-rc4/</link>
		<comments>http://blog.cakephp-brasil.org/2008/12/19/nova-versao-do-cakephp-no-ar-rc4/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 10:13:45 +0000</pubDate>
		<dc:creator>Juan Basso</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[novidade]]></category>
		<category><![CDATA[RC4]]></category>
		<category><![CDATA[testes]]></category>

		<guid isPermaLink="false">http://blog.cakephp-brasil.org/?p=65</guid>
		<description><![CDATA[Ontem foi lançada a versão candidata a release número 4. As principais modificações em relação ao RC3 são os massivos testes automatizados, aumentando ainda mais a confiabilidade do core.
Mais informações podem ser vistas em http://bakery.cakephp.org/articles/view/rc4-close.
]]></description>
			<content:encoded><![CDATA[<p>Ontem foi lançada a versão candidata a release número 4. As principais modificações em relação ao RC3 são os massivos testes automatizados, aumentando ainda mais a confiabilidade do core.</p>
<p>Mais informações podem ser vistas em <a href="http://bakery.cakephp.org/articles/view/rc4-close">http://bakery.cakephp.org/articles/view/rc4-close</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cakephp-brasil.org/2008/12/19/nova-versao-do-cakephp-no-ar-rc4/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pensando no CakePHP para SofterHouse&#8217;s</title>
		<link>http://blog.cakephp-brasil.org/2008/09/12/pensando-no-cakephp-para-softerhouses/</link>
		<comments>http://blog.cakephp-brasil.org/2008/09/12/pensando-no-cakephp-para-softerhouses/#comments</comments>
		<pubDate>Sat, 13 Sep 2008 00:11:47 +0000</pubDate>
		<dc:creator>Juan Basso</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[diretorio]]></category>
		<category><![CDATA[erp]]></category>
		<category><![CDATA[módulo]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[route]]></category>
		<category><![CDATA[softerhouse]]></category>

		<guid isPermaLink="false">http://blog.cakephp-brasil.org/?p=58</guid>
		<description><![CDATA[Pessoal,
 
Estava pensando sobre o desenvolvimento de um sistema modular (um ERP, CRM, etc), vendido em partes para o cliente e que o código fosse deixado no cliente (nem que fosse criptografado com as diversas ferramentas que há disponível por aí&#8230;). Dai pensei, como fazer isso com o CakePHP?!
Pensando, achei que fosse legal criar cada módulo [...]]]></description>
			<content:encoded><![CDATA[<p>Pessoal,</p>
<p> </p>
<p>Estava pensando sobre o desenvolvimento de um sistema modular (um ERP, CRM, etc), vendido em partes para o cliente e que o código fosse deixado no cliente (nem que fosse criptografado com as diversas ferramentas que há disponível por aí&#8230;). Dai pensei, como fazer isso com o CakePHP?!</p>
<p>Pensando, achei que fosse legal criar cada módulo como um plugin, inclusive alguns recursos básicos do sistema, como a parte de autenticação (login). Deixar a &#8216;app&#8217; como um barramento da aplicação, fornecendo components, helpers, layouts, css/js, vendors, etc. Essa parte funcionaria como uma infra estrutura do sistema, onde as rotas poderiam ser criadas dinâmicamente pelo AppController do plugin ou usar as rotas diretamente do sistema (plugin/controller/action/params).</p>
<p>Hoje o CakePHP dispões de várias funções para identificar se o app possui um componente ou outro plugin instalado, podendo os plugins &#8220;se conversarem&#8221;. O comando App::listObjects(&#8216;Plugin&#8217;), por exemplo é fantástico para saber se um outro módulo também está instalado. Assim não precisaria cadastrar cada módulo numa base de dados, que poderia ser manipulada pelo cliente ou coisa do genero.</p>
<p>O mesmo poderia ser aplicado a uma empresa que possui diversos softwares, não necessariamente inteligados (em módulos). Onde todas as aplicações teriam um ambiente de desenvolvimento comum (barramento) e cada aplicação seria um plugin. Isso reduziria a quantidade de código e, consequentemente, o tamanho da aplicação nos clientes que tiverem mais de uma aplicação.</p>
<p> </p>
<p>O que acham? Já passaram por algo assim?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cakephp-brasil.org/2008/09/12/pensando-no-cakephp-para-softerhouses/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Trabalhando com JSON no CakePHP 1.2</title>
		<link>http://blog.cakephp-brasil.org/2008/09/11/trabalhando-com-json-no-cakephp-12/</link>
		<comments>http://blog.cakephp-brasil.org/2008/09/11/trabalhando-com-json-no-cakephp-12/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 01:13:44 +0000</pubDate>
		<dc:creator>Juan Basso</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[controller]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[view]]></category>

		<guid isPermaLink="false">http://blog.cakephp-brasil.org/?p=52</guid>
		<description><![CDATA[Com o crescimento do uso de AJAX, da maioria dos frameworks de JavaScript (jQuery, Prototype, mooTools, YUI, ExtJS, &#8230;) e de uma dúvida no Groups do Google (Action que renderize apenas o layout, sem necessidade de uma view), resolvi escrever um post falando sobre como usar JSON no CakePHP de forma automática para retorno dos [...]]]></description>
			<content:encoded><![CDATA[<p>Com o crescimento do uso de AJAX, da maioria dos frameworks de JavaScript (jQuery, Prototype, mooTools, YUI, ExtJS, &#8230;) e de uma dúvida no Groups do Google (<a href="http://groups.google.com/group/cake-php-pt/browse_thread/thread/5052c43d26bfb477" target="_blank">Action que renderize apenas o layout, sem necessidade de uma view</a>), resolvi escrever um post falando sobre como usar JSON no CakePHP de forma automática para retorno dos dados, sem precisar gerar um arquivo de view para cada action e que não fere o MVC.<br />
<span style="font-weight: bold;">A Solução</span></p>
<p>Para solucionar o caso, achei que o melhor jeito seria criando uma classe de View nova. A classe View do CakePHP ela sempre procura um arquivo de view, além do template. Com a nova classe, seria feita a renderização ali mesmo, sem a necessidade de novos arquivos.</p>
<p>A classe que criei (JsonView) pode ser baixada <a href="http://blog.cakephp-brasil.org/wp-content/uploads/2008/09/json1.phps">aqui</a>. Ela deve ser colocada na pasta <span style="font-weight: bold;">views</span> de da sua aplicação (nenhuma sub-pasta) com o nome de <span style="font-weight: bold;">json.php</span>. Ou seja, no final, você terá o caminho <span style="font-weight: bold;">app/views/json.php</span>.<br />
<span style="font-weight: bold;">Como Usar</span></p>
<p>Para usar é bem simples. No seu controller, quando você for retornar um código em JSON, basta alterar a variável $view do controller para usar a nova classe. Além disso, os dados que você quer que retorne, devem ser setados com o nome &#8216;<span style="font-weight: bold;">json</span>&#8216; no seu controller. Caso não seja, ele vai renderizar normalmente. Exemplo de uso no controller:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p52code4'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p524"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p52code4"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> UsuariosController <span style="color: #000000; font-weight: bold;">extends</span> AppController <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$uses</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Usuario'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Grupo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #000088;">$json</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'usuarios'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Usuario</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'list'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$json</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Json'</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'json'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'usuarios'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> multilista<span style="color: #009900;">&#40;</span><span style="color: #000088;">$json</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'usuarios'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Usuario</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'list'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'grupos'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Grupo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'list'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$json</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Json'</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'json'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'usuarios'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'grupos'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Neste caso, quando o parâmetro de <span style="font-weight: bold;">index</span> não for true, ele vai renderizar como se fosse uma requisição normal. Caso passe como true, ele irá renderizar como JSON. Já no método <span style="font-weight: bold;">multilista</span>, além do parâmetro para verificar se é JSON, ele passa um array de variáveis para a view JSON, assim a classe irá renderizar mais de uma variável.</p>
<p>Outra maneira de se fazer é definir a variável $view da classe diretamente com &#8216;Json&#8217; (assim como foi feito com $uses no exemplo). Assim, sempre que você der um set na variável &#8216;json&#8217;, a classe da View se liga e renderiza em json, caso contrário mantém o normal.</p>
<p><span style="font-weight: bold;">Conclusão</span></p>
<p>Este é um método fácil e rápido de renderizar as requisições JSON, sem precisar criar um arquivo para cada requisição e sem precisar de muito código (tanto no controller, quanto na view).</p>
<p>O código que fiz, é compatível com PHP 4 e 5, então é possível usar com o CakePHP sem medo em qualquer versão de PHP.</p>
<p>Abraços e bom uso. <img src='http://blog.cakephp-brasil.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Dicas são sempre bem vindas.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cakephp-brasil.org/2008/09/11/trabalhando-com-json-no-cakephp-12/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Sai RC1 do CakePHP 1.2</title>
		<link>http://blog.cakephp-brasil.org/2008/06/04/sai-rc1-do-cakephp-12/</link>
		<comments>http://blog.cakephp-brasil.org/2008/06/04/sai-rc1-do-cakephp-12/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 01:27:17 +0000</pubDate>
		<dc:creator>Juan Basso</dc:creator>
				<category><![CDATA[Outros]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[lançamento]]></category>
		<category><![CDATA[novidade]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[versão]]></category>

		<guid isPermaLink="false">http://blog.cakephp-brasil.org/?p=26</guid>
		<description><![CDATA[Boas novas, cakers!
Saiu hoje a nova versão do CakePHP 1.2, através da release candidate (RC) 1, usando a revisão 7119.
As maiores alterações são alterações no modo de utilizar as condições e colocar vários métodos em desuso.
Para quem quiser mais informações sobre o lançamento, consulte o link oficial (no Bakery). Quem quiser fazer o download agora, clique [...]]]></description>
			<content:encoded><![CDATA[<p>Boas novas, cakers!</p>
<p>Saiu hoje a nova versão do CakePHP 1.2, através da release candidate (RC) 1, usando a revisão 7119.</p>
<p>As maiores alterações são alterações no modo de utilizar as condições e colocar vários métodos em desuso.</p>
<p>Para quem quiser mais informações sobre o lançamento, consulte o <a href="http://bakery.cakephp.org/articles/view/release-pure-cake-power-in-rc1" target="_blank">link oficial</a> (no Bakery). Quem quiser fazer o download agora, <a href="http://cakeforge.org/frs/download.php/624/cake_1.2.0.7119-rc1.zip" target="_blank">clique aqui</a>.</p>
<p> </p>
<p>Abraços e bom uso para todos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cakephp-brasil.org/2008/06/04/sai-rc1-do-cakephp-12/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
