<?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>Marcelo Rodrigues &#187; Php</title>
	<atom:link href="http://www.marcelomx.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcelomx.com</link>
	<description>Web Developer</description>
	<lastBuildDate>Wed, 20 Apr 2011 17:49:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>PHPHEDERAL 2011</title>
		<link>http://www.marcelomx.com/2011/04/20/phphederal-2011/</link>
		<comments>http://www.marcelomx.com/2011/04/20/phphederal-2011/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 17:49:06 +0000</pubDate>
		<dc:creator>Marcelo Rodrigues</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[brasilia]]></category>
		<category><![CDATA[df]]></category>
		<category><![CDATA[evento]]></category>
		<category><![CDATA[phphederal]]></category>

		<guid isPermaLink="false">http://www.marcelomx.com/?p=130</guid>
		<description><![CDATA[Já foram iniciados os trabalhos para a realização do PHPHEDERAL 2011. E eu faço parte de corpo organizador desta vez junto com a atual coordenação do PHPDF. Vai ser um prazer ajudar a realizar o maior evento PHP do Distrito &#8230; <a href="http://www.marcelomx.com/2011/04/20/phphederal-2011/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Já foram iniciados os trabalhos para a realização do <a href="http://www.phphederal.com.br" target="_blank">PHPHEDERAL 2011</a>. E eu faço parte de corpo organizador desta vez junto com a atual coordenação do <a href="http://www.phpdf.org.br" target="_blank">PHPDF</a>. Vai ser um prazer ajudar a realizar o maior evento PHP do Distrito Federal.</p>
<p>Esse ano a proposta é fazer um evento bem direcionado ao profissional que já trabalha a muitos anos com PHP, com temas voltados a análise, arquitetura, engenharia e qualidade de software. Temas mais atuais, como metodologias ágeis também estão no cardápio.</p>
<p>Apesar de focar nos desenvolvedores mais experientes, por assim dizer, o público iniciante e menos experiente não vai ficar de fora. Palestras, estudos de caso e cursos serão ofertados na grade do evento.</p>
<p>O evento esse ano tem tudo para ser o melhor evento já realizado para os profissionais PHP no DF.</p>
<p>Mais novidades, no <a href="http://www.phphederal.com.br" target="_blank">site do evento</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomx.com/2011/04/20/phphederal-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Iniciando com desenvolvimento orientado a testes com PHP</title>
		<link>http://www.marcelomx.com/2009/12/28/iniciando-com-desenvolvimento-orientado-a-testes-com-php/</link>
		<comments>http://www.marcelomx.com/2009/12/28/iniciando-com-desenvolvimento-orientado-a-testes-com-php/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 02:00:24 +0000</pubDate>
		<dc:creator>Marcelo Rodrigues</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[mock]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[simpletest]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://www.marcelomx.com/?p=76</guid>
		<description><![CDATA[Esse post é só para &#8220;comentar&#8221; rapidamente sobre um assunto muito pouco explorado em PHP: o Desenvolvimento Orientado a Testes ou, para os mais acostumados, TDD -  Test Driven Development. Recentemente comecei a escrever sobre testes com o php usando &#8230; <a href="http://www.marcelomx.com/2009/12/28/iniciando-com-desenvolvimento-orientado-a-testes-com-php/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Esse post é só para &#8220;comentar&#8221; rapidamente sobre um assunto muito pouco explorado em PHP: o Desenvolvimento Orientado a Testes ou, para os mais acostumados, TDD -  Test Driven Development.</p>
<p>Recentemente comecei a escrever sobre testes com o php usando o PHPUnit. Na empolgação, os textos ficaram gigantes, por isso vou precisar revisar bem antes de publicar. Talvez até separá-los em uma série de artigos.</p>
<p>Enquanto isso, continuo pesquisando e estudando sobre o assunto. Num desses estudos, estava pesquisando sobre Mock Objects, e eis que me deparo com um artigo em português sobre testes com php e, por sinal, muito bom. Embora o framework utilizado nos artigos seja o SimpleTest, que é bem mais simples e menos conhecido que o PHPUnit, não tira o mérito dos textos.</p>
<p>A série de artigos está publicada no Imasters, de autoria do Léo Hackin. Vale a pena acompanhar.</p>
<ul>
<li><a href="http://imasters.uol.com.br/artigo/13569/php/iniciando_com_o_simpletest/" target="_blank">Iniciando com o SimpleTest</a></li>
<li><a href="http://imasters.uol.com.br/artigo/13717/php/agrupando_casos_de_teste_no_simpletest/" target="_blank">Agrupando casos de teste no SimpleTest</a></li>
<li><a title="Mock Objects no SimpleTest" href="http://imasters.uol.com.br/artigo/15259/php/mock_objects_no_simpletest/">Mock Objects no SimpleTest</a></li>
</ul>
<p> <img src='http://www.marcelomx.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomx.com/2009/12/28/iniciando-com-desenvolvimento-orientado-a-testes-com-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Escrevendo URLs no Zend Framework</title>
		<link>http://www.marcelomx.com/2008/12/30/escrevendo-urls-no-zend-framework/</link>
		<comments>http://www.marcelomx.com/2008/12/30/escrevendo-urls-no-zend-framework/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 18:40:07 +0000</pubDate>
		<dc:creator>Marcelo Rodrigues</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Helper]]></category>
		<category><![CDATA[Url]]></category>
		<category><![CDATA[View]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.marcelomx.com/?p=36</guid>
		<description><![CDATA[O Zend Framework, assim com os demais frameworks que utilizam o padrão MVC, possui uma estrutura de roteamento para mapear e direcionar corretamente os seus controles e ações de acordo com determinada url requisitada pela aplicação. Também como os demais, &#8230; <a href="http://www.marcelomx.com/2008/12/30/escrevendo-urls-no-zend-framework/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>O Zend Framework, assim com os demais frameworks que utilizam o padrão MVC, possui uma estrutura de roteamento para mapear e direcionar corretamente os seus controles e ações de acordo com determinada url requisitada pela aplicação. Também como os demais, possibilita a escrita de urls para estes controles na camada de visualização quando necessário, através dos &#8220;helpers&#8221;.</p>
<p>Infelizmente, o helper responsável pela escrita dessas urls ainda é bastante imaturo. A forma como deve ser feita esta tarefa é trabalhosa, chata e principalmente, improdutiva. Só o fato de ter de indicar &#8220;TODOS&#8221; os parâmetros para a escrita da URL em uma estrutura de array associativa soa como um paradoxo, já que o próprio framework possui mecanismos que fazem o parser na url requisitada, identificando os parâmetros necessários e passando-os ao roteador. Ou seja, é um retrabalho e não um reúso. Exemplo de uma url escrita da forma padrão em um arquivo de template.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">url</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'users'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'action'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'edit'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'id'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">25</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>A saída do exemplo será: /users/edit/id/25. Analisando a url, seria mais fácil simplesmente escrever da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;/users/edit/id/25&quot;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Desta forma o resultado é mais rápido, porém, você perde em termos controle, já que a escrita é manual e se você alterar o nome do controle ou da ação, a url passará a ser inválida (a não ser que você use roteadores customizados).</p>
<p>A maioria dos frameworks, como Symfony, Cake etc, implementam tanto a forma de escrita com os parâmetros em um array, quanto uma string contendo a url desejada, fazendo a conversão automática dos mesmos para o formato padrão do framework ou da aplicação. O Symfony, por exemplo, implementa a escrita da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php <span style="color: #b1b100;">echo</span> url_for<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'users/edit?id='</span><span style="color: #339933;">.</span> <span style="color: #cc66cc;">25</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>O Symfony automaticamente converterá isso para o formato /users/edit/id/25. Considero essa forma muito mais elegante e produtiva, pois está mais próximo da realidade das urls &#8220;dinâmicas&#8221;. No entanto, se houver mais parâmetros, a coisa já começa a complicar.</p>
<p>Voltando a forma como o Zend Framework implementa este recurso, já se sabe que ele não é tão flexível assim, então é necessário criar um helper na camada de visualização para esta tarefa. Podemos inclusive, aproveitar o que já foi desenvolvido e é padrão do framework e encontra-se na pasta: Zend/View/Helper/Url.php.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #666666; font-style: italic;">#Zend/View/Helper/Url.php
</span>
<span style="color: #000000; font-weight: bold;">class</span> Zend_View_Helper_Url <span style="color: #000000; font-weight: bold;">extends</span> Zend_View_Helper_Abstract
 <span style="color: #009900;">&#123;</span>
 	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> url<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span> <span style="color: #000088;">$urlOptions</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$reset</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #000088;">$encode</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>
 	<span style="color: #009900;">&#123;</span>
 	<span style="color: #000088;">$router</span> <span style="color: #339933;">=</span> Zend_Controller_Front<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getRouter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$router</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assemble</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$urlOptions</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$reset</span><span style="color: #339933;">,</span> <span style="color: #000088;">$encode</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	<span style="color: #009900;">&#125;</span>
 <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Crie um arquivo de helper com o nome que você quiser e o coloque no diretório de helpers da sua aplicação. O meu eu chamei de MyUrl.php. Crie neste arquivo a classe Zend_View_Helper_MyUrl. Dentro da classe, crie o método myUrl. É importante ressaltar que o nome do helper deve estar no nome do arquivo, como sufixo do nome da classe e como método principal, que é avaliado e chamado pelo objeto Zend_View ao ser requisitado no template.</p>
<p>O método myUrl terá os mesmos parâmetros do helper Url, com exceção que o primeiro parametro poderá tanto ser uma string quanto um array, então não é necessário tipá-la.</p>
<p>A classe então terá a seguinte estrutura.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'Zend/View/Helper/Abstract.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Zend_View_Helper_MyUrl <span style="color: #000000; font-weight: bold;">extends</span> Zend_View_Helper_Abstract
<span style="color: #009900;">&#123;</span> 
     <span style="color: #009933; font-style: italic;">/**
       * Return the URL
       *
       * @param string|array $urlOptions
       * @param string       $name
       * @param bool         $reset
       * @param bool         $encode
       * @return string
       */</span>
       <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> myUrl<span style="color: #009900;">&#40;</span><span style="color: #000088;">$urlOptions</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$reset</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #000088;">$encode</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>
       <span style="color: #009900;">&#123;</span>
          <span style="color: #000088;">$front</span>  <span style="color: #339933;">=</span> Zend_Controller_Front<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #000088;">$router</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$front</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getRouter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$urlOptions</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
             <span style="color: #000088;">$urlOptions</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span> <span style="color: #990000;">ltrim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$urlOptions</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Case the first character is a '?</span>
             <span style="color: #000088;">$request</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Controller_Request_Http<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Creates a cleaned instance of request http</span>
             <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setBaseUrl</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$front</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getBaseUrl</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
             <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setRequestUri</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$urlOptions</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
             <span style="color: #000088;">$route</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$router</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">route</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Return the request route with params modifieds</span>
             <span style="color: #000088;">$urlOptions</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$route</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParams</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #009900;">&#125;</span>
 	  <span style="color: #b1b100;">return</span>  <span style="color: #000088;">$router</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assemble</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$urlOptions</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$reset</span><span style="color: #339933;">,</span> <span style="color: #000088;">$encode</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
 <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Salvo o helper, é só utilizá-lo. Agora ele suporta todos os formatos:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">myUrl</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
   <span style="color: #0000ff;">'controller'</span><span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'users'</span><span style="color: #339933;">,</span>
   <span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'edit'</span><span style="color: #339933;">,</span>
   <span style="color: #0000ff;">'id'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">25</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>ou</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">myUrl</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'users/edit?id=25'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>ou</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">myUrl</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'users/edit/id/25'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Muito mais simples, elegante e bem produtivo!</p>
<p>É possível ainda utilizar os outros parâmetros do helper padrão, como o nome do roteador a ser utilizado para formatar a url, se o mesmo vai ou não utilizar a url base ou somente a partir da atual e se a url será codificada ou não &#8211; bastante útil para utilizar como valor de outros parametros. <img src='http://www.marcelomx.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomx.com/2008/12/30/escrevendo-urls-no-zend-framework/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Zend Framework 1.7</title>
		<link>http://www.marcelomx.com/2008/11/20/zend-framework-17/</link>
		<comments>http://www.marcelomx.com/2008/11/20/zend-framework-17/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 12:33:16 +0000</pubDate>
		<dc:creator>Marcelo Rodrigues</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[amf]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Jquery]]></category>
		<category><![CDATA[Paginator]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.marcelomx.com/?p=34</guid>
		<description><![CDATA[Já está disponível a versão 1.7 do Zend Framework. Vários aprimoramentos importantes foram incluídos. Claro, o destaque, sem dúvida alguma, é para o componente AMF (que pode ser baixado separadamente), para criação de aplicativos remotos Flash com PHP. Além do &#8230; <a href="http://www.marcelomx.com/2008/11/20/zend-framework-17/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Já está disponível a versão 1.7 do Zend Framework. Vários aprimoramentos importantes foram incluídos. Claro, o destaque, sem dúvida alguma, é para o componente AMF (que pode ser baixado separadamente), para criação de aplicativos remotos Flash com PHP.</p>
<p>Além do suporte ao AMF, os componentes FileTransfer e ProgressBar foram dois adicionais importantes para upload e download de arquivos e verificação do status de envio e carregamento de arquivos, respectivamente. Mas, ainda precisam amadurecer bastante, pois há muita coisa não implementada, principalmente no FileTransfer, que não tem implementação para download e somente suporta o protocolo HTTP.</p>
<p>Um componente bacana que fazia muita falta era o de paginação, que no ZendFramework, serve não só para paginar resultados de consultas de banco, mas também para datasources oriundos de xmls, arrays, desde que os mesmos implementem ou a interface Iterator. Como é quase certo que boa parte da utilização desse componente é com banco de dados, implementaram agora o suporte ao Zend_Db_Table. Isso é muito importante na hora de paginar, pois o Paginator apenas implementava a paginação e executa os resultados retornando um objeto ArrayIterator apenas, dificultando bastante a tarefa de paginar os resultados de uma tabela extendida do Zend_Db_Table, que teria que ser feito manualmente pelo método limit no select da tabela. Agora o paginator já faz isso, bastando apenas passar o objeto da tabela, que o fará utilizar o adaptador DbTableSelect.</p>
<p>Outra novidade, é o ZendX, que nessa versão, traz o componente Zend_JQuery, que suportará métodos para escrita de código javascript na camada de visualização. Isso é um passo importante, pois o Zend Framework já suporta o Dojo, e como há uma variedade frameworks javascript, é interessante esse suporte. O mais legal é que não será preciso dizer ao script de visualização que componente você utilizará, mas, apenas escrever o método relativo a funcionaliadde javascript que deseja e o framework se encarrega do resto. Como o jQuery é praticamente o mais famoso e mais utilizado hoje, é certo que esse componente fará uma grande diferença no futuro.</p>
<p>Também foi promovido ao incubator, o Zend_Tool, componente que proverá classes para geração de código Php, interface em linha de comando para criação e gerenciamento de projetos MVC em ZendFramework, que para mim era o que faltava para ser de fato o melhor framework, pois há muito tempo os demais já ofereciam essa opção, como o Symfony. Alías, esse será o foco do framework na versão 1.8, o desenvolvimento rápido de aplicações, ou RAD, do termo em inglês, para os íntimos.</p>
<p>Na integração de serviços, foi aperfeiçoado o suporte ao GData e adicionado suporte ao Twitter.</p>
<p>O Zend Framework 1.7 está disponível para download <a class="regularArticleU" href="http://framework.zend.com/" target="_blank">here.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomx.com/2008/11/20/zend-framework-17/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Desenvolvendo no padrão MVC com Zend Framework</title>
		<link>http://www.marcelomx.com/2007/04/26/desenvolvendo-no-padrao-mvc-com-zend-framework/</link>
		<comments>http://www.marcelomx.com/2007/04/26/desenvolvendo-no-padrao-mvc-com-zend-framework/#comments</comments>
		<pubDate>Thu, 26 Apr 2007 21:54:17 +0000</pubDate>
		<dc:creator>Marcelo Rodrigues</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[cake]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[Model]]></category>
		<category><![CDATA[Model Import]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Scaffold]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://marcelomx.wordpress.com/2007/04/26/desenvolvendo-no-padrao-mvc-com-zend-framework/</guid>
		<description><![CDATA[Quando se fala de desenvolvimento no padrão MVC com o PHP a primeira palavra que se vém a mente é framework. E pesquisando sobre essa palavra, iremos encontrar uma vasta lista de ambientes. Desta lista, já testei o Symfony, Cake, &#8230; <a href="http://www.marcelomx.com/2007/04/26/desenvolvendo-no-padrao-mvc-com-zend-framework/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Quando se fala de desenvolvimento no padrão MVC com o PHP a primeira palavra que se vém a mente é framework. E pesquisando sobre essa palavra, iremos encontrar uma vasta lista de ambientes. Desta lista, já testei o Symfony, Cake, CodeIgniter e QCodo. Até agora, nenhum satisfez minhas necessidades completamente, talvez por serem fechados ou pesados demais, esta é minha a opinião. Mas isso até eu começar a estudar o Zend framework, que não é exatamente  um framework, mas sim um conjunto de componentes prontos que oferecem funcionalidades para se montar um framework de desenvolvimento no padrão MVC, como também utilizar os mesmos componentes em aplicações que não usem necessariamente este padrão.</p>
<p>A proposta dele é excelente, o que possibilita digamos, da criação do seu próprio framework, com a estrutura (scaffold) criada a sua maneira. Existem excelentes artigos já em português falando sobre ele, além de um manual completo de utilização. Por isso não vou me estender falando sobre ele.</p>
<p>Uma das dificuldades de alguns desenvolvedores que começaram a utilizá-lo e alvo de constantes questionamentos é a falta do componente que implementa a camada Model. Apesar de já possuir uma bom componente para abstrair o banco de dados e manipular seus dados sem a necessidade de muitos comandos SQL, a camada model ainda faz uma falta, mesmo não sendo um problema grave, já que é possível utilizar qualquer biblioteca que faça o mapeamento objeto relacional como o Lumine, Propel, Doctrine entre outros. Mas ao utilizar qualquer uma dessas bibliotecas, o componente Zend_Db acaba perdendo um pouco a sua utilidade.</p>
<p>Por isso, resolvi escrever e tentar submeter este componente ao core do ZendFramework. Até o momento tenho duas classes escritas parcialmente em testes: Zend_Model e Zend_Model_Import. A primeira classe mapeia o diretório onde estão as entidades e as carrega a medida que forem sendo necessárias, usando um arquivo XML gerado que armazena dados de conexão ao banco ou simplesmente usando uma conexão já feita anteriormente. A segunda classe lista as tabelas do banco e gera as classes das entidades do modelo automaticamente ou importa a partir de um xml contendo todo o esquema do banco.</p>
<p>Nos próximos posts vou mostrar mais ou menos como estou implementando essa camada e coletar sugestões para futuras alterações, antes de submetê-la.</p>
<p>Até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomx.com/2007/04/26/desenvolvendo-no-padrao-mvc-com-zend-framework/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Alterando o Lumine Config para diferentes servidores</title>
		<link>http://www.marcelomx.com/2007/03/16/alterando-o-lumine-config-para-diferentes-servidores/</link>
		<comments>http://www.marcelomx.com/2007/03/16/alterando-o-lumine-config-para-diferentes-servidores/#comments</comments>
		<pubDate>Fri, 16 Mar 2007 02:25:47 +0000</pubDate>
		<dc:creator>Marcelo Rodrigues</dc:creator>
				<category><![CDATA[Php]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[class path]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Hugo]]></category>
		<category><![CDATA[Lumine]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://marcelomx.wordpress.com/2007/03/16/alterando-o-lumine-config-para-diferentes-servidores/</guid>
		<description><![CDATA[Atualmente venho utilizando o Lumine, um framework usado para mapeamento objeto relacional para banco de dados, que foi desenvolvido pelo Hugo, meu amigo e ex-sócio na administração do MXSTUDIO. Não me aprofundarei falando sobre as características do framework, deixando para &#8230; <a href="http://www.marcelomx.com/2007/03/16/alterando-o-lumine-config-para-diferentes-servidores/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Atualmente venho utilizando o <a title="Lumine - Database Mapping for PHP" href="http://www.hufersil.com.br/lumine" target="_blank">Lumine</a>, um framework usado para mapeamento objeto relacional para banco de dados, que foi desenvolvido pelo Hugo, meu amigo e ex-sócio na administração do MXSTUDIO. Não me aprofundarei falando sobre as características do framework, deixando para um próximo post mais elaborado que certamente valerá a pena.</p>
<p style="text-align:justify;">Em minha opinião, o Lumine está entre as melhores ferramentas para gerar e trabalhar um camada de persistência usando o mapeamento objeto relacional de um banco, graças a sua simplicidade de implementação e velocidade na execução dos comandos de inserção e seleção de dados.</p>
<p style="text-align:justify;">Como disse anteriormente, em outro post relatarei em detalhes a ferramenta, que segundo o autor, ainda necessita de uma documentação mais completa que ainda não pôde ser feita devido à falta de tempo do mesmo. Desta forma, quem tiver interesse em contribuir, fique a vontade.</p>
<p style="text-align:justify;">No Lumine existe um arquivo de configuração que é utilizado para todas as operações entre a aplicação e o banco de dados, desde a conexão, carregamento das classes referentes aos objetos relacionais, engenharia reversa, criação deschemas, etc. Este arquivo pode ser gerado tanto em XML quanto em PHP. Particularmente, acredito que o formato PHP é mais interessante por ter as informações de configuração armazenadas em um array , impossibilitando desta forma que um usuário veja esses dados acessando o arquivo direto pela URL, caso o mesmo esteja visível na árvore de diretórios do site. Já comXML isso não acontece, a não ser que você configure os mime types permitidos para acesso externo, ou simplesmente altere a permissão do mesmo arquivo via FTP para que ele não seja lido pelo via browser.</p>
<p style="text-align:justify;">Aqui vou falar apenas do arquivo PHP, uma vez que no XML o trabalho é manual mesmo, não há outra saída. No arquivo de configuração, há duas chaves importantes que são a base para o carregamento das classes de negócio:class-path e use-cache. Veja abaixo um exemplo deste arquivo:</p>
<pre>$lumineConfig = array (
	’configuration’ =&gt; array (
		‘class-path’ =&gt; ‘C:\lumine’,
		‘host’ =&gt; ‘localhost’,
		‘database’ =&gt; ‘meudatabase’,
		‘dialect’ =&gt; ‘mysql’,
		‘port’ =&gt; ‘3306′,
		‘user’ =&gt; ‘usuario’,
		‘password’ =&gt; ‘*****’,
		‘package’ =&gt; ‘orm’,
		‘maps’ =&gt; ‘map’,
		‘use-cache’ =&gt; ‘C:\lumine\cache.txt’,
		‘remove_prefix’ =&gt; ”,
		‘acao’ =&gt; ‘Iniciar’,
		‘create-classes’ =&gt; ‘1′,
		‘create-maps’ =&gt; ‘1′,
		‘escape’ =&gt; ‘1′,
		‘empty-as-null’ =&gt; ‘1′,
		‘generate-accessors’ =&gt; ‘1′,
		‘fileDate’ =&gt; filemtime(__FILE__)
	),
	’maps’ =&gt; array (
	‘map.Pessoa’
	)
);</pre>
<p style="text-align:justify;">Repare que o valor do caminho do <span style="font-style:italic;">class-path</span> é o padrão de diretório do Windows. Supondo que o seu servidor de produção seja Linux e que o servidor de testes seja Windows, então é provável que um erro no carregamento das classes aconteça em um dos sistemas por um não reconhecer a árvore de diretório do outro. A solução neste caso seria alterar então o caminho do diretório de forma que cada sistema leia o arquivo que contenha o diretório relativo ao seu sistema de diretório, ou seja, uma versão para o Windows e outro para o Linux. Mas isso não é muito saudável, uma vez que um erro de sincronização poderia fazer com que um arquivo sobrescrevesse o outro. Já passei por esta experiência e posso afirmar que alterar caminhos físicos de diretório manualmente é extremamente trabalhoso e chato.</p>
<p style="text-align:justify;">Este arquivo de configuração pode ser gerado tanto manualmente quanto automaticamente pelo LumineReverse, uma classe utilizada para a construção das classes e mapeamentos xml do banco usando engenharia reversa. Neste processo, o Lumine gera o caminho para as classes, mapeamentos e o cache, de acordo com o sistema operacional em que ele estiver rodando. Por isso, é bom ficar atento a este detalhe.</p>
<p style="text-align:justify;">Uma solução para não ter problemas quanto ao caminho correto, é usar a função <span style="font-style:italic;">dirname </span>do php, que retorna o caminho completo do arquivo passado por parâmetro. Neste caso, o parâmetro é a constante global __FILE__, que indica o caminho do arquivo relativo aoscript que está executando o comando. Exemplo:</p>
<pre><code><span style="font-size:10pt;">&lt;?php</span></code><span style="font-size:10pt;font-family:'Courier New';">
<code>// Caminho original do arquivo: C:\aplicacao\lumine-config.php</code>
<code>echo dirname(__FILE__); // Retorna C:\aplicacao</code>
<code>?&gt;</code></span></pre>
<p style="text-align:justify;">Mas atenção, isso só é válido se você tiver o lumine-config no mesmo diretório dos diretórios de mapeamento e pacote de classes. Exemplo da estrutura:</p>
<pre><code><span style="font-size:10pt;">aplicacao</span></code><span style="font-size:10pt;font-family:'Courier New';">
<code>/mapeamentos</code>
<code>/pacote</code>
<code>lumine-config.php</code>
<code>cache.txt</code></span></pre>
<p style="text-align:justify;">Alterando então as diretivas use-cache e class-path para que ambas funcionem em qualquer servidor, com a necessidade apenas de alteração do usuário, host e senha do banco a qual o script irá se conectar, o arquivo ficará assim:</p>
<pre>$lumineConfig = array (
	’configuration’ =&gt; array (
		‘class-path’ =&gt; dirname(__FILE__),
		‘host’ =&gt; ‘localhost’,
		‘database’ =&gt; ‘meudatabase’,
		‘dialect’ =&gt; ‘mysql’,
		‘port’ =&gt; ‘3306′,
		‘user’ =&gt; ‘usuario’,
		‘password’ =&gt; ‘*****’,
		‘package’ =&gt; ‘orm’,
		‘maps’ =&gt; ‘map’,
		‘use-cache’ =&gt; dirname(__FILE__) . ‘/cache.txt’,
		‘remove_prefix’ =&gt; ”,
		‘acao’ =&gt; ‘Iniciar’,
		‘create-classes’ =&gt; ‘1′,
		‘create-maps’ =&gt; ‘1′,
		‘escape’ =&gt; ‘1′,
		‘empty-as-null’ =&gt; ‘1′,
		‘generate-accessors’ =&gt; ‘1′,
		‘fileDate’ =&gt; filemtime(__FILE__)
	),
	’maps’ =&gt; array (
	‘map.Pessoa’
	)
);</pre>
<p style="text-align:justify;">Assim, o carregamento verificará o caminho para as classes e para o arquivo cache.txt, de acordo com o que retornar a função <span style="font-style:italic;">dirname</span>, em tempo real, e com o sistema em que o script estiver rodando, eliminando a possibilidade de erros e leitura dos dados por estarem em caminhos diferentes.</p>
<p style="text-align:justify;">Em um outro artigo, falarei sobre o Lumine e introduzirei alguns macetes para inserção e seleção de dados simples e complexos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcelomx.com/2007/03/16/alterando-o-lumine-config-para-diferentes-servidores/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

