<?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>Horizontes Digitais &#187; PHP</title>
	<atom:link href="http://horizontesdigitais.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://horizontesdigitais.com</link>
	<description>Desenvolvimento, Segurança e Negócios</description>
	<lastBuildDate>Sat, 24 Jul 2010 20:34:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Pré inscrições para o curso de PHP</title>
		<link>http://horizontesdigitais.com/2009/01/20/pre-inscricoes-para-o-curso-de-php/</link>
		<comments>http://horizontesdigitais.com/2009/01/20/pre-inscricoes-para-o-curso-de-php/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 19:42:08 +0000</pubDate>
		<dc:creator>Fernando Chucre</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[ceara]]></category>
		<category><![CDATA[curso php]]></category>
		<category><![CDATA[formação]]></category>
		<category><![CDATA[inscrições]]></category>
		<category><![CDATA[zce]]></category>

		<guid isPermaLink="false">http://horizontesdigitais.com/2009/01/20/pre-inscricoes-para-o-curso-de-php/</guid>
		<description><![CDATA[Depois de varias conversas e muitas contas, estamos muito proximos de lançar o primeiro curso do site HorizontesDigitais. Esse curso vai abranger muitos assuntos. Algumas pessoas precisam ser lembradas aqui, uma delas é o Jefferson Girã, um amigo que consquistei no ano de 2008, e que ficará presente por muitos ano. Mas para  melhorar as [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de varias conversas e muitas contas, estamos muito proximos de lançar o primeiro curso do site HorizontesDigitais. Esse curso vai abranger muitos assuntos. Algumas pessoas precisam ser lembradas aqui, uma delas é o Jefferson Girã, um amigo que consquistei no ano de 2008, e que ficará presente por muitos ano.</p>
<p>Mas para  melhorar as condiçõs do curso, horario e outros assuntos, elaboramos um formulario de <a href="http://www.polldaddy.com/s/08534D016EB75C57/">pré-incrição para o curso</a>.</p>
<p>Estamos prevendo um curso para os seguintes topicos:</p>
<ul>
<li> Fundamentos do PHP</li>
<li>Depuração</li>
<li>PHP Orientado a Objeto</li>
<li>Acesso a Dados com PHP e ORM</li>
<li>Design Patterns em PHP</li>
<li>XML e WebServices</li>
<li>AJAX</li>
<li>Segurança de Aplicações PHP</li>
<li>Zend Framework</li>
<li>Zend Certified Engineer</li>
<li>Teste com PHPUnit</li>
</ul>
<p>Logo traremos mais novidades</p>
]]></content:encoded>
			<wfw:commentRss>http://horizontesdigitais.com/2009/01/20/pre-inscricoes-para-o-curso-de-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Colunista do Horizontes Digitais terá palestra no PHPConference 2008</title>
		<link>http://horizontesdigitais.com/2008/09/24/colunista-do-horizontes-digitais-tera-palestra-no-phpconference-2008/</link>
		<comments>http://horizontesdigitais.com/2008/09/24/colunista-do-horizontes-digitais-tera-palestra-no-phpconference-2008/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 17:41:43 +0000</pubDate>
		<dc:creator>Fernando Chucre</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[PHP Conference]]></category>

		<guid isPermaLink="false">http://horizontesdigitais.com/2008/09/24/colunista-do-horizontes-digitais-tera-palestra-no-phpconference-2008/</guid>
		<description><![CDATA[No próximo PHPConference eu estarei palestrando sobre OpenSocial e integração com o PHP. Essa palestra originalmente é do meu amigo Christiano Milfont, que se especializou em JavaScript, Web2.0 e por consequencia na API OpenSocial. Mais informações do evento pode ser obtido no site do evento.]]></description>
			<content:encoded><![CDATA[<p>No próximo <a href="http://www.phpconf.com.br/">PHPConference</a> eu estarei palestrando sobre OpenSocial e integração com o PHP. Essa palestra originalmente é do meu amigo <a href="http://www.milfont.org/tech/">Christiano Milfont</a>, que se especializou em JavaScript, Web2.0 e por consequencia na API OpenSocial.</p>
<p>Mais informações do evento pode ser obtido no <a href="http://www.phpconf.com.br/">site do evento</a>.</p>
<p><img src="http://www.phpconf.com.br/includes/templates/padrao/imagens/promo/phpconf_speaker_btn_pt.gif" width="220" height="60" border="0" /></p>
]]></content:encoded>
			<wfw:commentRss>http://horizontesdigitais.com/2008/09/24/colunista-do-horizontes-digitais-tera-palestra-no-phpconference-2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lançamento do CEPUG</title>
		<link>http://horizontesdigitais.com/2008/09/08/lancamento-do-cepug/</link>
		<comments>http://horizontesdigitais.com/2008/09/08/lancamento-do-cepug/#comments</comments>
		<pubDate>Mon, 08 Sep 2008 18:42:01 +0000</pubDate>
		<dc:creator>Fernando Chucre</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[CEPUG]]></category>

		<guid isPermaLink="false">http://horizontesdigitais.com/2008/09/08/lancamento-do-cepug/</guid>
		<description><![CDATA[Neste último sabado (30 de agosto) foi realizado o evento de lançamento do CEPUG. Contamos com a presença de 28 pessoas. As palestras ficaram por conta de Fernando Chucre e Christiano Milfont que falaram de Certificação PHP, OpenSocial e o ZendFramework. O coofe-break foi bem movimentado. Trocamos contatos e experiências e criamos amigos! Esse é [...]]]></description>
			<content:encoded><![CDATA[<p>Neste último sabado (30 de agosto) foi realizado o evento de lançamento do CEPUG. Contamos com a presença de 28 pessoas. As palestras ficaram por conta de Fernando Chucre e Christiano Milfont que falaram de Certificação PHP, OpenSocial e o ZendFramework.</p>
<p>O coofe-break foi bem movimentado. Trocamos contatos e experiências e criamos amigos! Esse é e deve ser sempre o espírito do evento, criar novos conhecimentos, relacionamentos e amigos. O tema mais comentado foi as iniciativas de Web2.0 que estão surgindo no mundo. E que o Ceará não pode ficar de fora dessas tecnologias.</p>
<p>O proximo evento será no dia 27 de Setembro, sem palestas ainda definidas, mas com a certeza de ter um voucher da Zend Certified Engineer. Contamos com a presença de todos!</p>
<p><a href="http://cepug.org/encontros/evento-dia-30-de-agosto/">Mais detalhes..</a></p>
<p>Abraços</p>
]]></content:encoded>
			<wfw:commentRss>http://horizontesdigitais.com/2008/09/08/lancamento-do-cepug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando foreach para modificar array com referencia</title>
		<link>http://horizontesdigitais.com/2008/05/14/usando-foreach-para-modificar-array-com-referencia/</link>
		<comments>http://horizontesdigitais.com/2008/05/14/usando-foreach-para-modificar-array-com-referencia/#comments</comments>
		<pubDate>Thu, 15 May 2008 01:04:58 +0000</pubDate>
		<dc:creator>Fernando Chucre</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[arrays]]></category>

		<guid isPermaLink="false">http://horizontesdigitais.com/2008/05/14/usando-foreach-para-modificar-array-com-referencia/</guid>
		<description><![CDATA[Durante meus estudos para a prova de certificação da Zend (é amanhã!!) eu me deparei com uma questão em um simulado. A pergunta era sobre qual a melhor iteração possivel com o seguinte array, um detalhe, era necessario modificar os valores do array: $myNames = array(&#8216;Joao&#8217;,'Maria&#8217;,'Carlos&#8217;); A resposta correta que o simulado indicava era a [...]]]></description>
			<content:encoded><![CDATA[<p>Durante meus estudos para a prova de certificação da Zend (é amanhã!!) eu me deparei com uma questão em um simulado. A pergunta era sobre qual a melhor iteração possivel com o seguinte array, um detalhe, era necessario modificar os valores do array:</p>
<blockquote>
<h5><strong>$myNames = array(&#8216;Joao&#8217;,'Maria&#8217;,'Carlos&#8217;);</strong></h5>
</blockquote>
<p>A resposta correta que o simulado indicava era a estrutura de controle for(;;) mostrando que a estrutura de controle foreach copiava o valor do indice para a variavel determinada. Isso e verdade, na forma comumente usada, porem a estrutura foreach permite o uso de modificador de linguagem &amp; que indica a inicialização de uma referencia. Da seguinte maneira:</p>
<blockquote>
<h5>foreach ($myNames as &amp;$name)<br />
{<br />
&#8230;.<br />
}</h5>
</blockquote>
<p>Desta forma o ponteiro interno do array é resetado para a primeira posição, depois em cada iteração é deslocado uma posição para cima ou frente até o final e sempre usando a referencia, ou seja, a variavel $name é de fato a posição de iteração do array. Quando mudamos o valor da variavel $name mudamos o valor de $myNamos[x], onde x é a iteração atual.</p>
]]></content:encoded>
			<wfw:commentRss>http://horizontesdigitais.com/2008/05/14/usando-foreach-para-modificar-array-com-referencia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando Order By Desc no Zend Framework</title>
		<link>http://horizontesdigitais.com/2008/05/11/usando-order-by-desc-no-zend-framework/</link>
		<comments>http://horizontesdigitais.com/2008/05/11/usando-order-by-desc-no-zend-framework/#comments</comments>
		<pubDate>Sun, 11 May 2008 21:23:34 +0000</pubDate>
		<dc:creator>Fernando Chucre</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[order by]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://horizontesdigitais.com/2008/05/11/usando-order-by-desc-no-zend-framework/</guid>
		<description><![CDATA[Durando essa semana passei por um pequeno problema durante o desenvolvimento de uma funcionalidade para o Tuangr Loterias. A funcionalidade é para mostrar os ultimos resultados dos sorteios da Mega-Sena, e para essa funcionalidade era interesante eu ordernar o sorteio pelo ordem decrescente, ou seja, tinha que usar o order by desc. Mas durante a [...]]]></description>
			<content:encoded><![CDATA[<p>Durando essa semana passei por um pequeno problema durante o desenvolvimento de uma funcionalidade para o Tuangr Loterias. A funcionalidade é para mostrar os ultimos resultados dos sorteios da Mega-Sena, e para essa funcionalidade era interesante eu ordernar o sorteio pelo ordem decrescente, ou seja, tinha que usar o order by desc. Mas durante a busca na documentação não achei nada, nem no manual nem da refencia da API. Bom, depois de uma hora buscando alguma resposta na internet eu resolvi debugar o codigo, e depois de alguns minutos eu verifiquei como ele decidia se iria usar o ASC (ascendente) ou o DESC (descendente). O ZF usa uma verificação de expressão regular assim para você usar o DESC é necessario coloca um espaço e depois &#8220;DESC&#8221; em cada coluna que você desejar. Assim o uso seria:</p>
<blockquote>
<h5>$resultadosT = new ResultadosMegSena();<br />
$sorteios = $resultadosT-&gt;fetchAll(null,&#8217;dt_sorteio DESC&#8217;)-&gt;toArray();</h5>
</blockquote>
<p>Isso fara o ZF usar o &#8216;order by dt_sorteio DESC&#8217;.</p>
<p>Abraços</p>
]]></content:encoded>
			<wfw:commentRss>http://horizontesdigitais.com/2008/05/11/usando-order-by-desc-no-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando rotas MVC no Zend Framework</title>
		<link>http://horizontesdigitais.com/2008/05/05/criando-rotas-mvc-no-zend-framework/</link>
		<comments>http://horizontesdigitais.com/2008/05/05/criando-rotas-mvc-no-zend-framework/#comments</comments>
		<pubDate>Mon, 05 May 2008 05:38:52 +0000</pubDate>
		<dc:creator>Fernando Chucre</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://horizontesdigitais.com/2008/05/05/criando-rotas-mvc-no-zend-framework/</guid>
		<description><![CDATA[No meu ultimo artigo eu mostrei como criar uma aplicação MVC com o Zend Framework. No artigo eu mostrei como funcionava as rotas padrões e como elas chegavam as ações. Mas se eu quizer que a URL http://appmv/chucre encaminhe para o controle User e para a ação Info e ainda informe a ação o nome [...]]]></description>
			<content:encoded><![CDATA[<p>No meu <a href="http://horizontesdigitais.com/2008/05/02/criando-uma-aplicacao-mvc-com-zend-framework/" title="Criando uma aplicação MVC com Zend Framework">ultimo artigo</a> eu mostrei como criar uma aplicação MVC com o Zend Framework. No artigo eu mostrei como funcionava as rotas padrões e como elas chegavam as ações. Mas se eu quizer que a URL http://appmv/chucre encaminhe para o controle User e para a ação Info e ainda informe a ação o nome solicitado (chucre)? Hoje vou mostrar como fazer isso.</p>
<p><span id="more-14"></span></p>
<p>Rapidamente para relembrar como funciona por padrão, segue alguns exemplos:</p>
<ul>
<li>http://appmvc/
<ul>
<li>modulo: default</li>
<li>controle: index</li>
<li>ação: index</li>
</ul>
</li>
<li>http://appmvc/user
<ul>
<li>modulo: default</li>
<li>controle: user</li>
<li>ação: index</li>
</ul>
</li>
<li>http://appmvc/user/userinfo/
<ul>
<li>modulo: default</li>
<li>controle: user</li>
<li>ação: userinfo</li>
</ul>
</li>
<li>http://appmvc/user/userinfo/id/1
<ul>
<li>modulo: default</li>
<li>controle: user</li>
<li>ação: userinfo</li>
</ul>
<ul>
<li>parâmetros:
<ul>
<li>id = 1</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Para fazer customizar as rotas usaremos a classe Zend_Controller_Router_Rewrite. Essa classe usa o método addroute para incluir uma nova rota. Esse método espera dois argumentos, o primeiro uma string que é o nome da rota, o segundo uma instancia de uma das seguintes classes:</p>
<ul>
<li>Zend_Controller_Router_Route</li>
<li>Zend_Controller_Router_Rewrite</li>
</ul>
<p>Vamos usar o exemplo do nosso questionamento: http://appmv/chucre. Temos que fazer que essa requisição chegue ao controle User e a ação Info. Para isso vamos usar a classe Zend_Controller_Router_Route.</p>
<p>Vamos analisar o seguinte código:</p>
<blockquote>
<h5><strong>$router     = new Zend_Controller_Router_Rewrite();<br />
$router-&gt;addroute(&#8216;comp_js&#8217;,new                   Zend_Controller_Router_Route(&#8216;/:user_name&#8217;,<br />
array(<br />
&#8216;controller&#8217; =&gt; &#8216;user&#8217;,<br />
&#8216;action&#8217;     =&gt; &#8216;info&#8217;<br />
)<br />
));</strong></h5>
</blockquote>
<p>Aqui temos uma instancia da classe Zend_Controller_Router_Rewrite ($router) com uma roda adicionada que encaminhara ao controle e ação desejados. Dentro da ação  &#8216;info&#8217; o parâmetro &#8216;user_name&#8217; estará preenchido com o nome &#8216;chucre&#8217; ou qualquer outro que for solicitado, essa requisição será a mesma coisa que solicitar http://appmvc/user/info/user_name/chucre ou http://appmvc/user/info/?user_name=chucre.</p>
<p>Acho que a maioria das necessidades serão resolvidas seguindo o exemplo acima, mas se você precisar de mais flexibilidade como usar expressões regulares, leia mais no <a href="http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.regex" title="Router_Regex">manual do Zend Framework</a>.</p>
<p>Abraços</p>
]]></content:encoded>
			<wfw:commentRss>http://horizontesdigitais.com/2008/05/05/criando-rotas-mvc-no-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando uma aplicação MVC com Zend Framework</title>
		<link>http://horizontesdigitais.com/2008/05/02/criando-uma-aplicacao-mvc-com-zend-framework/</link>
		<comments>http://horizontesdigitais.com/2008/05/02/criando-uma-aplicacao-mvc-com-zend-framework/#comments</comments>
		<pubDate>Fri, 02 May 2008 05:08:29 +0000</pubDate>
		<dc:creator>Fernando Chucre</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://horizontesdigitais.com/2008/05/02/criando-uma-aplicacao-mvc-com-zend-framework/</guid>
		<description><![CDATA[Criando uma aplicação MVC com Zend Framework Seguindo minha serie de artigos que mostraram como criar uma aplicação PHP usando REST e MVC no Zend Framework, hoje vou descrever como criar uma aplicação tradicional com MVC. Todos os conceitos necessários serão abordados, passando pelo mapeamento de objetos-relacional a construção do controle e view. Como sempre [...]]]></description>
			<content:encoded><![CDATA[<p>Criando uma aplicação MVC com Zend Framework</p>
<p>Seguindo minha serie de artigos que mostraram como criar uma aplicação PHP usando REST e MVC no Zend Framework, hoje vou descrever como criar uma aplicação tradicional com MVC. Todos os conceitos necessários serão abordados, passando pelo mapeamento de objetos-relacional a construção do controle e view. Como sempre uma pequena introdução teórica.</p>
<p>O que é MVC?</p>
<p>Segundo a Wikipedia MVC é “um padrão de arquitetura de software. Com o aumento da complexidade das aplicações desenvolvidas torna-se fundamental a separação entre os dados (Model) e o layout (View). Desta forma, alterações feitas no layout não afectam a manipulação de dados, e estes poderão ser reorganizados sem alterar o layout. “<span id="more-37"></span></p>
<p>Por tanto as aplicações que usam MVC tem 3 camadas distintas, Modelo, Visão e Controle. O modelo é sua regra de negocio e persistência. Nessa camada você pode fazer como você quiser, não importa como, basta que você isole essas atividades do controle e visão. A visão é a forma que você vai apresentar ao usuário final, no caso de aplicações WEB será o HTML, mas pode ser outra coisa qualquer. O controle é quem vai organizar e chamar as outras duas camadas, dependendo da solicitação do usuário.</p>
<p>No caso da WEB o controle SEMPRE será a primeira camada a ser instanciada, pois a ação inicial sempre é escolhe de um usuário um endereço para visitar, assim essa chamada inicial é tratada por um controle. Esse controle ira determinar, dependendo da solicitação qual ou quais classes de modelo deve instanciar e qual será a visão utilizada para apresentar os dados ao usuário/sistema que solicitou a ação. A escolha da visão geralmente é chamada de renderizar.</p>
<p>O MVC não determina como deve ser implementado cada uma das camadas, mas somente como elas se comunicação. Mas é sempre bom usar um padrão de mapeamento objeto-relacional. O Zend Framework prove um pacote para essa atividade chamado Zend_Db.</p>
<p>Nossa aplicação de exemplo é composto de 2 tabelas, uma para armazenar as contas do usuário, outra para armazenar as lista de Feeds. A seguir serão listados as ações que serão implementadas.</p>
<ul>
<li>Criar usuário</li>
<li>Editar usuário</li>
<li>Adicionar Feed</li>
<li>Remover Feed</li>
</ul>
<p>No nosso exemplo precisaremos apenas de dois controles. Um chamado de &#8216;Index&#8217;, que ira receber as requisições padrões e outra chamada User.</p>
<p>Agora que temos uma visão teórica do MVC e uma ideia de como o sistema será, podemos nos aprofundar no Zend Framework. Para iniciar ou mostrar as principais classes que o ZF oferece para nos auxiliar na tarefa.</p>
<p align="justify">&nbsp;</p>
<ul>
<li>Zend_Controller_Request_Http – Classe de manipulação da requisição</li>
<li>Zend_Controller_Response_Http – Classe de manipulação da resposta</li>
<li>Zend_Controller_Action – Classe base de todas as classes de controle da aplicação</li>
<li>Zend_Controller_Front – Classe que implementa o FrontController e chama o despacho da requisição.</li>
</ul>
<p align="justify"> Para ter uma visão mais geral do processo segue o fluxo de uma requisição comum e onde iremos interferir no fluxo.</p>
<p align="justify"><a href="http://horizontesdigitais.com/wp-content/blogs.dir/127/files/2008/05/zendcontrollerbasics.png" title="Floxo ZendFramework MVC"><img src="http://horizontesdigitais.com/wp-content/blogs.dir/127/files/2008/05/zendcontrollerbasics.png" alt="Floxo ZendFramework MVC" border="0" /></a><br />
Toda a parte que esta dentro do retângulo em vermelho é feito pelo ZF. A parte em azul será onde colocaremos nosso controle e no retângulo verde é onde esta o objeto Response, que por padrão chamara a classe Zend_View. Essa classe chamara de um arquivo que este será nossa visão.</p>
<p>Como dito anteriormente, o MVC não exige uma implementação em padrões do modelo, assim a estrutura do ZF na parte dos Controllers é para encaminhar a requisição ao seu controle e a ação correta. Vamos entender como funciona isso, a seguir você verá uma estrutura padrão de uma aplicação desenhada para o ZF.<br />
<a href="http://horizontesdigitais.com/wp-content/blogs.dir/127/files/2008/05/file_list3.PNG" title="Lista de arquivos da aplicação"><img src="http://horizontesdigitais.com/wp-content/blogs.dir/127/files/2008/05/file_list3.PNG" alt="Lista de arquivos da aplicação" border="0" /></a></p>
<p>A pasta application é onde colocaremos nossos módulos do sistema. Nesse caso somente o &#8216;default&#8217;. Abaixo desse modulo será usado 3 pastas, isolando cada uma das camadas. A que merece uma atenção maior é a camada da visão, que neste caso separa os arquivos pelo mesmo nome do controle, e sua extensão por padrão é phtml.</p>
<p>A pasta que será publicada é a appmvc/html/. Nela há dois arquivos. Um que ira prepara o ambiente para a chamada dos controles, o index.php, e outra que ira redirecionar todas as requisições para o index.php, o &#8216;.htaccess&#8217;.</p>
<p>Uma olhada nesses arquivos.<br />
AppMVC/.htaccess</p>
<blockquote><p>RewriteEngine on<br />
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php</p></blockquote>
<p>AppMVC/index.php</p>
<blockquote>
<h5><font color="#000000"><strong>&lt;?php</strong></font><font color="#000000"><strong>/*<br />
* Inclui a pasta AppMVC/library e AppMVC/application/default/models/ no include_path<br />
*/<br />
set_include_path(&#8216;..&#8217; . PATH_SEPARATOR . &#8216;../library&#8217; . PATH_SEPARATOR . &#8216;../application/default/models/&#8217; . PATH_SEPARATOR . get_include_path());</strong></font><font color="#000000"><strong>/*<br />
* Aqui inclui varias classe do ZF para uso. Coloque o ZF na pasta AppMVC/library<br />
*/</strong></font><font color="#000000"><strong>require_once &#8216;Zend/Controller/Front.php&#8217;; /* Classe reponsavel pelo FrontController */<br />
require_once &#8216;Zend/Db/Table.php&#8217;; /* Classe para setar instancia do banco de dados para todos os Models */<br />
require_once &#8216;Zend/Db.php&#8217;; /* Classe para instanciar o banco do dados. */<br />
require_once &#8216;Zend/Config.php&#8217;; /* Classe para ler as configurações do banco. */</strong></font><font color="#000000"><strong>/*<br />
* Dados de acesso ao seu servidor de dados<br />
*<br />
* adapter =&gt; tipo de conexão (MySQL, PostgreSQL, Oracle, etc).<br />
*<br />
*/</strong></font><font color="#000000"><strong>$config = new Zend_Config(<br />
array(<br />
&#8216;database&#8217; =&gt; array(<br />
&#8216;adapter&#8217; =&gt; &#8216;Mysqli&#8217;,<br />
&#8216;params&#8217; =&gt; array(<br />
&#8216;dbname&#8217; =&gt; &#8216;appmvc&#8217;,<br />
&#8216;username&#8217; =&gt; &#8216;userDB&#8217;,<br />
&#8216;password&#8217; =&gt; &#8216;XXX&#8217;,<br />
&#8216;host&#8217; =&gt; &#8216;localhost&#8217;<br />
)<br />
)<br />
)<br />
);</strong></font></p>
<p><font color="#000000"><strong>/*<br />
* Aqui seta a instancia default para todas as classes de acesso a dados<br />
*/</strong></font></p>
<p><font color="#000000"><strong>Zend_Db_Table_Abstract::setDefaultAdapter(Zend_Db::factory($config-&gt;database));</strong></font></p>
<p><font color="#000000"><strong>/**<br />
* Instancia o FrontController, configura o diretório padrão<br />
*/<br />
$controller = Zend_Controller_Front::getInstance();<br />
$controller-&gt;setControllerDirectory(&#8216;../application/default/controllers&#8217;);<br />
$controller-&gt;throwExceptions(false); // should be turned on in development time</strong></font></p>
<p><font color="#000000"><strong>// Executa do despacho da operação solicitada.<br />
$controller-&gt;dispatch();<br />
?&gt;</strong></font></h5>
</blockquote>
<p align="justify">Na camada de modelo temos 2 arquivos que vão mapear os objetos-relacional, em geral usamos um arquivo para cada tabela no banco. Antes de mostrar o conteúdo dos arquivos uma rápida olhada pelas principais classes que vão nos auxiliar nessa tarefa de mapeamento.</p>
<ul>
<li>Zend_Db_Table_Abstract
<ul>
<li>fetchAll()</li>
<li>find()</li>
<li>delete()</li>
<li>insert()</li>
<li>update()</li>
<li>fetchRow()</li>
<li>getAdapter()</li>
</ul>
</li>
<li>Zend_Db_Table_Rowset_Abstract
<ul>
<li>current()</li>
<li>count()</li>
<li>getTable()</li>
<li>key()</li>
<li>next()</li>
<li>toArray()</li>
</ul>
</li>
<li>Zend_Db_Table_Row_Abstract
<ul>
<li>delete()</li>
<li>save()</li>
<li>toArray()</li>
</ul>
</li>
</ul>
<p>Nosso modelo de dados é o seguinte:</p>
<p><a href="http://horizontesdigitais.com/wp-content/blogs.dir/127/files/2008/05/appmvc.png" title="Modelo de dados da aplicação"><img src="http://horizontesdigitais.com/wp-content/blogs.dir/127/files/2008/05/appmvc.png" alt="Modelo de dados da aplicação" border="0" /></a></p>
<p align="justify">A representação deste modelo na nossa aplicação será em duas classe: User e Feed.</p>
<p>AppMVC/application/default/models/User.php</p>
<blockquote>
<h5><strong>&lt;?php<br />
require_once &#8216;Zend/Db/Table/Abstract.php&#8217;;<br />
class User extends Zend_Db_Table_Abstract {<br />
protected $_name = &#8216;User&#8217;;<br />
protected $_primary = &#8216;idUser&#8217;;</strong><strong>protected $_dependentTables = array(&#8216;Feed&#8217;);<br />
}<br />
?&gt;<br />
</strong></h5>
</blockquote>
<p>Bom neste arquivo criamos a classe User. Ela estende da classe Zend_Db_Table_Abstract e ela define 3 propriedades como preteridas, que são:</p>
<ul>
<li>$_name: nome da tabela no banco de dados.</li>
<li>$_primary: colunas da chave primaria, pode ser um string ou um array de strings para tabelas com chaves compostas.</li>
<li>$_dependentTables: um array de strings para dizer quais outras classes tem dependência com esta, para relacionamento.</li>
</ul>
<p>Seguimos com o arquivo que mapeara a tabela Feed.<br />
AppMVC/application/default/models/Feed.php</p>
<blockquote>
<h5><strong>&lt;?php<br />
require_once &#8216;Zend/Db/Table/Abstract.php&#8217;;</strong><strong>class Feed extends Zend_Db_Table_Abstract {<br />
protected $_name = &#8216;Feed&#8217;;<br />
protected $_primary = &#8216;idFeed&#8217;;</strong><strong>protected $_referenceMap = array(<br />
&#8216;User&#8217; =&gt; array(<br />
&#8216;columns&#8217;           =&gt; &#8216;idUser&#8217;,<br />
&#8216;refTableClass&#8217;     =&gt; &#8216;User&#8217;,<br />
&#8216;refColumns&#8217;        =&gt; &#8216;idUser&#8217;<br />
));</strong><strong>}<br />
?&gt;</strong></h5>
</blockquote>
<p align="justify">Neste vemos a propriedade $_referenceMap, que é efetivamente onde criamos os relacionamentos entre as classes. A propriedade é uma matriz onde temos no primeiro nível o nome da regra, no nosso caso &#8216;User&#8217;. Ele sendo um array que tem a propriedade &#8216;columns&#8217;, pode ser uma string ou um array de string, que vai indicar os campos na tabela &#8216;Feed&#8217; para relacionamento. A propriedade &#8216;refTableClass&#8217; indica a CLASSE de referencia e não o nome da tabela e por fim a propriedade &#8216;refColumns&#8217; indica os campos na tabela &#8216;User&#8217;.</p>
<p align="justify">Antes de mostrar o conteúdo dos controles vamos entender como o ZF funciona no despacho das requisições, como uma solicitação de uma URL chega ao controle da aplicação.</p>
<p>O ZF trabalha com 3 níveis na parte do controle:</p>
<ul>
<li>Module: O padrão é o default, por isso nossa aplicação tem essa pasta. O modulo é um conjunto de classes de controle.</li>
<li>Controller: é a classe de controle, que manterá os métodos de acesse publico. O ZF determina que uma classe de controle seja nomecontrole+Controller, por exemplo, UserController.</li>
<li>Action: método de chamada publica. Assim como o controle a ação deve ser seguida de Action.</li>
</ul>
<p align="justify">Quando o despacho é realizado o ZF tenta identificar qual é o controle solicitado e a ação. Essa identificação é realizada usando o path solicitado. A primeira parte do path é entendido como o modulo, se a aplicação não setou nenhum modulo ou somente 1, o ZF considera que a  primeira parte do path é o controle. Depois do controle esta a ação, se a ação ou o controle não são informados o ZF os nomeia como &#8216;index&#8217;. Veja os exemplos.</p>
<ul>
<li>http://appmvc/
<ul>
<li>modulo: default</li>
<li>controle: index</li>
<li>ação: index</li>
</ul>
</li>
<li>http://appmvc/user
<ul>
<li>modulo: default</li>
<li>controle: user</li>
<li>ação: index</li>
</ul>
</li>
<li>http://appmvc/user/userinfo/
<ul>
<li>modulo: default</li>
<li>controle: user</li>
<li>ação: userinfo</li>
</ul>
</li>
<li>http://appmvc/user/userinfo/id/1
<ul>
<li>modulo: default</li>
<li>controle: user</li>
<li>ação: userinfo</li>
<li>parâmetros:
<ul>
<li>id = 1</li>
</ul>
</li>
</ul>
</li>
</ul>
<p align="justify">No ultimo exemplo foi adicionado ao path &#8216;/id/1&#8242;, isso foi colocado para mostrar que se desejado pode-se passar parâmetros ao controle via path. Assim a o parâmetro &#8216;id&#8217; sera preenchido com o valor 1, isso tem o mesmo efeito que passar a valor via variável via chamada get (&#8216;?id=1&#8242;).</p>
<p align="justify">Nota: Quando um controle chamado não existe ou quando uma Exception não é tratada o ZF chama o controle Error e a ação Error.</p>
<p>Assim segue o conteúdo dos arquivos de controle.</p>
<p>AppMVC/application/default/controllers/ErrorController.php</p>
<blockquote>
<h5><strong>&lt;?php<br />
require_once &#8216;Zend/Controller/Action.php&#8217;;<br />
class ErrorController extends Zend_Controller_Action<br />
{</strong><strong>/**<br />
* This action handles<br />
*    &#8211; Application errors<br />
*    &#8211; Errors in the controller chain arising from missing<br />
*      controller classes and/or action methods<br />
*/<br />
public function errorAction()<br />
{<br />
$errors = $this-&gt;_getParam(&#8216;error_handler&#8217;);<br />
switch ($errors-&gt;type) {<br />
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:<br />
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:<br />
/*404 error &#8211; controller or action not found                 */<br />
$this-&gt;getResponse()-&gt;setRawHeader(&#8216;HTTP/1.1 404 Not Found&#8217;);<br />
$this-&gt;view-&gt;title = &#8216;HTTP/1.1 404 Not Found&#8217;;<br />
break;<br />
default:<br />
/* application error; display error page, but don&#8217;t change */<br />
/* status code */<br />
$this-&gt;view-&gt;title = &#8216;Application Error&#8217;;<br />
break;<br />
}</strong><strong>$this-&gt;view-&gt;message = $errors-&gt;exception;<br />
}<br />
}<br />
?&gt;</strong><strong>AppMVC/application/default/controllers/IndexController.php<br />
&lt;?php<br />
require_once &#8216;Zend/Controller/Action.php&#8217;;</strong><strong>class IndexController extends Zend_Controller_Action<br />
{<br />
/**<br />
* The default action &#8211; show the home page<br />
*/<br />
public function indexAction()<br />
{<br />
$this-&gt;_forward(&#8216;index&#8217;,'user&#8217;);<br />
}<br />
}<br />
?&gt;<br />
</strong></h5>
</blockquote>
<p>AppMVC/application/default/controllers/IndexController.php</p>
<blockquote>
<h5><strong>&lt;?php</strong><strong>require_once &#8216;Zend/Controller/Action.php&#8217;;<br />
require_once &#8216;application/default/models/User.php&#8217;;<br />
require_once &#8216;application/default/models/Feed.php&#8217;;</strong><strong>class UserController extends Zend_Controller_Action {<br />
/*<br />
* Método padrão de acesso<br />
*/<br />
public function indexAction()<br />
{<br />
/*lista todos os usuários*/</strong><strong>/*instancia da classe User (Modelo)*/<br />
$users = new User();</strong><strong>/*lista de todos os usuários*/<br />
$userList = $users-&gt;fetchAll();</strong><strong>/*pega a instancia da classe view */<br />
$view = $this-&gt;initView();</strong></p>
<p><strong>/*set a propriedade usersList da classe view com o array de todos os usuários */<br />
$view-&gt;usersList = $userList-&gt;toArray();</strong></p>
<p><strong>/* renderiza a view home.phtml */<br />
$this-&gt;render(&#8216;home&#8217;);<br />
}</strong></p>
<p><strong>public function adduserAction()<br />
{<br />
/*inclui novo usuário e lista todos os usuários*/<br />
$users = new User();<br />
$view = $this-&gt;initView();</strong></p>
<p><strong>/* pega as variáveis passadas na requisição, nome e about*/<br />
$name = $this-&gt;getRequest()-&gt;getParam(&#8216;name&#8217;);<br />
$about = $this-&gt;getRequest()-&gt;getParam(&#8216;about&#8217;);</strong></p>
<p><strong>/*verifica se as variáveis foram passadas*/<br />
if (!$name) $error = true;<br />
if (!$about) $error = true;</strong></p>
<p><strong>if ($error)<br />
{<br />
$view-&gt;errorMsg = &#8216;Faltaram dados.&#8217;;<br />
}<br />
else<br />
{<br />
$data = array(<br />
&#8216;name&#8217;=&gt;$name,<br />
&#8216;about&#8217;=&gt;$about<br />
);<br />
$users-&gt;insert($data);<br />
}</strong></p>
<p><strong>/* aqui depois de fazer as alterações repassa para a ação que mostrara as informações */<br />
$this-&gt;_forward(&#8216;index&#8217;);<br />
}</strong></p>
<p><strong>public function infouserAction()<br />
{<br />
/*mostra informações de um usuário incluindo suas feed*/<br />
$users = new User();<br />
$view = $this-&gt;initView();<br />
$id = $this-&gt;getRequest()-&gt;getParam(&#8216;id&#8217;);</strong></p>
<p><strong>if (!$id)<br />
{<br />
$view-&gt;errorMsg = &#8216;Faltam dados&#8217;;<br />
$this-&gt;render(&#8216;home&#8217;);<br />
return;<br />
}<br />
else<br />
{<br />
/* pega a registro solicitado */<br />
$user = $users-&gt;find($id)-&gt;current();<br />
if ($user)<br />
{<br />
$feeds = $user-&gt;findDependentRowset(&#8216;Feed&#8217;);<br />
$view-&gt;userInfo = $user-&gt;toArray();<br />
$view-&gt;userFeeds = $feeds-&gt;toArray();<br />
$this-&gt;render(&#8216;info-user&#8217;);<br />
}<br />
else<br />
{<br />
$view-&gt;errorMsg = &#8216;Usuario não existe&#8217;;<br />
$this-&gt;render(&#8216;home&#8217;);<br />
return;<br />
}<br />
}<br />
}</strong></p>
<p><strong>public function edituserAction()<br />
{<br />
$view = $this-&gt;initView();<br />
$users = new User();</strong></p>
<p><strong>$id = $this-&gt;getRequest()-&gt;getParam(&#8216;id&#8217;);<br />
$name = $this-&gt;getRequest()-&gt;getParam(&#8216;name&#8217;);<br />
$about = $this-&gt;getRequest()-&gt;getParam(&#8216;about&#8217;);</strong></p>
<p><strong>if (!$id)<br />
{<br />
$view-&gt;errorMsg = &#8216;Usuario não informado&#8217;;<br />
$this-&gt;_forward(&#8216;index&#8217;);<br />
return;<br />
}<br />
else<br />
{<br />
$user = $users-&gt;find($id)-&gt;current();<br />
if ($user)<br />
{<br />
if (!$name) $error = true;<br />
if (!$about) $error = true;</strong></p>
<p><strong>if ($error)<br />
{<br />
$view-&gt;errorMsg = &#8216;Informações faltando&#8217;;<br />
}<br />
else<br />
{<br />
$user-&gt;name = $name;<br />
$user-&gt;about = $about;<br />
$user-&gt;save();<br />
}<br />
$this-&gt;_forward(&#8216;infouser&#8217;);<br />
return;<br />
}<br />
else<br />
{<br />
$view-&gt;errorMsg = &#8216;Usuario não encontrado&#8217;;<br />
$this-&gt;_forward(&#8216;index&#8217;);<br />
return;<br />
}<br />
}<br />
}<br />
public function addfeedAction()<br />
{<br />
/*adiciona uma feed a lista do usuário*/<br />
$view = $this-&gt;initView();<br />
$feeds = new Feed();</strong></p>
<p><strong>$id = $this-&gt;getRequest()-&gt;getParam(&#8216;id&#8217;);<br />
$description = $this-&gt;getRequest()-&gt;getParam(&#8216;description&#8217;);<br />
$url = $this-&gt;getRequest()-&gt;getParam(&#8216;url&#8217;);</strong></p>
<p><strong>if (!$id)<br />
{<br />
$view-&gt;errorMsg = &#8216;Usuario não encontrado&#8217;;<br />
$this-&gt;_forward(&#8216;index&#8217;);<br />
return;<br />
}</strong></p>
<p><strong>if (!$description) $error = true;<br />
if (!$url) $error = true;</strong></p>
<p><strong>if ($error)<br />
{<br />
$view-&gt;errorMsg = &#8216;Error add Feed: faltaram dados&#8217;;<br />
}<br />
else<br />
{<br />
$data = array(<br />
&#8216;idUser&#8217;=&gt;$id,<br />
&#8216;url&#8217;=&gt;$url,<br />
&#8216;description&#8217;=&gt;$description<br />
);<br />
$feeds-&gt;insert($data);<br />
}<br />
$this-&gt;_forward(&#8216;infouser&#8217;);<br />
}<br />
public function delfeedAction()<br />
{<br />
/*delete uma feed da lista do usuário*/</strong></p>
<p><strong>$view = $this-&gt;initView();<br />
$feeds = new Feed();</strong></p>
<p><strong>$idUser = $this-&gt;getRequest()-&gt;getParam(&#8216;id&#8217;);<br />
$idFeed = $this-&gt;getRequest()-&gt;getParam(&#8216;idFeed&#8217;);</strong></p>
<p><strong>if (!$idUser)<br />
{<br />
$view-&gt;errorMsg = &#8216;Usuario não encontrado&#8217;;<br />
$this-&gt;_forward(&#8216;index&#8217;);<br />
return;<br />
}</strong></p>
<p><strong>if (!$idFeed)<br />
{<br />
$view-&gt;errorMsg = &#8216;Feed não informada&#8217;;<br />
}<br />
else<br />
{<br />
$feed = $feeds-&gt;find($idFeed)-&gt;current();<br />
if ($feed)<br />
{<br />
$feed-&gt;delete();<br />
}<br />
else<br />
{<br />
$view-&gt;errorMsg = &#8216;Feed não encontrada&#8217;;<br />
}<br />
}<br />
$this-&gt;_forward(&#8216;infouser&#8217;);<br />
}<br />
}</strong></p>
<p><strong>?&gt;</strong></h5>
</blockquote>
<p align="justify">Quando um ação não invoca o método $this-&gt;render() o ZF renderiza o arquivo como mesmo nome da ação. Em nossa aplicação usamos apenas 3 arquivos de visão, um para o controle de erro e outros dois para a o controle User.</p>
<p>AppMVC/application/default/views/scripts/error/error.phtml<strong><br />
</strong></p>
<blockquote>
<h5><strong>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Error Page&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h1&gt;&lt;? echo $this-&gt;title ?&gt;&lt;/h1&gt;<br />
&lt;? if ($this-&gt;message): ?&gt;<br />
&lt;p&gt;The following error occurred:&lt;/p&gt;<br />
&lt;? echo $this-&gt;message ?&gt;<br />
&lt;? endif; ?&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</strong></h5>
</blockquote>
<p align="justify">Nessa visão é utilizada as propriedades title e message. Essas foram populadas no método ErrorAction.</p>
<p>AppMVC/application/default/views/scripts/user/home.phtml</p>
<blockquote>
<h5><strong>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;appMVC Home&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;? if ($this-&gt;errorMsg): ?&gt;<br />
&lt;h2&gt;&lt;?=$this-&gt;errorMsg ?&gt;&lt;/h2&gt;<br />
&lt;? endif; ?&gt;<br />
Inclua novo usuário&lt;br&gt;<br />
&lt;form action=&#8221;/user/adduser&#8221;&gt;<br />
nome: &lt;input type=&#8217;text&#8217; name=&#8217;name&#8217; &gt;&lt;br&gt;<br />
sobre:<br />
&lt;textarea rows=&#8221;4&#8243; cols=&#8221;15&#8243; name=&#8217;about&#8217;&gt;&lt;/textarea&gt;&lt;br&gt;<br />
&lt;input type=&#8221;submit&#8221; value=&#8221;Criar&#8221;&gt;<br />
&lt;/form&gt;</strong><strong>&lt;hr&gt;<br />
Usuários cadastrados&lt;br&gt;</strong><strong>&lt;table border=1&gt;<br />
&lt;tbody&gt;<br />
&lt;? foreach($this-&gt;usersList as $user) <img src='http://horizontesdigitais.com/wp-includes/images/smilies/icon_confused.gif' alt=':?' class='wp-smiley' /> &gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;?=$user['name']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;a href=&#8217;/user/infouser/id/&lt;?=$user['idUser']?&gt;&#8217;&gt;Editar&lt;/a&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;? endforeach; ?&gt;<br />
&lt;/tbody&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</strong></h5>
</blockquote>
<p align="justify">Este arquivo pode chamar duas ações,&#8217;/user/adduser&#8217; para incluir um novo usuário, pelo form ou ver as informações de um usuário já criado através do link &#8216;/user/infouser/id/:idUser&#8217;.</p>
<p>AppMVC/application/default/views/scripts/user/info-user.phtml</p>
<blockquote>
<h5><strong>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;appMVC Home&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;a href=&#8221;/&#8221;&gt;Home&lt;/a&gt;<br />
&lt;hr&gt;<br />
&lt;? if ($this-&gt;errorMsg): ?&gt;<br />
&lt;h2&gt;&lt;?=$this-&gt;errorMsg ?&gt;&lt;/h2&gt;<br />
&lt;? endif; ?&gt;<br />
&lt;form action=&#8221;/user/edituser/id/&lt;?=$this-&gt;userInfo['idUser'] ?&gt;&#8221;&gt;<br />
nome: &lt;input type=&#8217;text&#8217; name=&#8217;name&#8217; value=&#8217;&lt;?=$this-&gt;userInfo['name']?&gt;&#8217;&gt;&lt;br&gt;<br />
sobre:<br />
&lt;textarea rows=&#8221;4&#8243; cols=&#8221;15&#8243; name=&#8217;about&#8217;&gt;&lt;?=$this-&gt;userInfo['about']?&gt;&lt;/textarea&gt;&lt;br&gt;<br />
&lt;input type=&#8221;submit&#8221; value=&#8221;Salvar&#8221;&gt;<br />
&lt;/form&gt;<br />
&lt;hr&gt;<br />
Adicionar Feed<br />
&lt;form action=&#8221;/user/addfeed/id/&lt;?=$this-&gt;userInfo['idUser'] ?&gt;&#8221;&gt;<br />
Descrição: &lt;input name=&#8217;description&#8217; size=&#8217;30&#8242; &gt;&lt;br&gt;<br />
URL: &lt;input name=&#8217;url&#8217; size=&#8217;60&#8242; &gt;&lt;br&gt;<br />
&lt;input type=&#8221;submit&#8221; value=&#8217;incluir&#8217;&gt;<br />
&lt;/form&gt;<br />
&lt;hr&gt;<br />
Feeds&lt;br&gt;<br />
&lt;table border=1&gt;<br />
&lt;? foreach ($this-&gt;userFeeds as $feed) <img src='http://horizontesdigitais.com/wp-includes/images/smilies/icon_confused.gif' alt=':?' class='wp-smiley' /> &gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;?=$feed['description']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;?=$feed['url']?&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;a href=&#8217;/user/delfeed/id/&lt;?=$this-&gt;userInfo['idUser'] ?&gt;/idFeed/&lt;?=$feed['idFeed']?&gt;&#8217;&gt;excluir&lt;/a&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;? endforeach; ?&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</strong></h5>
</blockquote>
<p>Nesta visão o usuário pode invocar 3 ações: edituser, addfeed e delfeed.</p>
<p align="justify">Acredito que agora o leitor poderá criar suas próprias aplicações usando o ZendFramework. Espero logo estar postando novos artigos com explicações mais técnicas. O codigo fonte da aplicação pode ser obtido <a href="http://horizontesdigitais.com/wp-content/blogs.dir/127/files/2008/05/appmvc.rar" title="Codigo fonte da aplicação functional">aqui</a>.</p>
<p>Abraços</p>
]]></content:encoded>
			<wfw:commentRss>http://horizontesdigitais.com/2008/05/02/criando-uma-aplicacao-mvc-com-zend-framework/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>REST, Web Services sem WSDL &#8211; Parte 2</title>
		<link>http://horizontesdigitais.com/2008/04/29/rest-web-services-sem-wsdl-parte-2/</link>
		<comments>http://horizontesdigitais.com/2008/04/29/rest-web-services-sem-wsdl-parte-2/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 23:13:24 +0000</pubDate>
		<dc:creator>Fernando Chucre</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://horizontesdigitais.com/2008/04/29/rest-web-services-sem-wsdl-parte-2/</guid>
		<description><![CDATA[Continuando o post do meu colega Claudio eu vou aprofundar o conceito de REST e forma de uso dos mesmo. Este artigo é uma serie de artigos que ira mostrar o uso de aplicações REST usando o PHP. A ideia é ter no final dessa serie uma aplicação funcional usando REST, provendo REST usando a [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando o <a href="http://horizontesdigitais.com/2008/04/18/rest-web-services-sem-wsdl/">post </a>do meu colega <a href="http://horizontesdigitais.com/author/claudioulisse/">Claudio </a>eu vou aprofundar o conceito de REST e forma de uso dos mesmo. Este artigo é uma serie de artigos que ira mostrar o uso de aplicações REST usando o PHP. A ideia é ter no final dessa serie uma aplicação funcional usando REST, provendo REST usando a técnica MVC.</p>
<p>O que é REST?</p>
<p>Segundo a <a href="http://pt.wikipedia.org/wiki/REST">Wikipedia </a>“A Transferência de Estado Representacional (Representational State Transfer) ou somente (REST) é uma técnica de engenharia de software para sistemas hipermídia distribuídos como a World Wide Web. O termo se originou no ano de 2000, em uma tese de doutorado (PHD) sobre a web escrita por Roy Fielding, um dos principais autores as especificação do protocolo HTTP que é utilizado por sites da internet ”.<span id="more-29"></span></p>
<p>Com essa técnica é possível criar serviços na WEB sem a necessidade de RPC ou SOAP. A definição dos serviços são através de recursos. Esse recursos são identificados por suas URLs, cada URL é um recurso   único e de deve estar definido em local único, assim se você tiver, por exemplo, uma aplicação MVC, que tem 2 controles, neste exemplo, Contas e Feeds, você deverá eleger quais recursos estarão disponíveis aos seus clientes.</p>
<p>Vamos imaginar que você quer disponibilizar o recurso http://nossorest.example.com/api/account/ para informações e edição de uma conta no sistema. Neste casso você quer por exemplo que o controle AccountController seja usando com a action infoAction e editAction. Para isso você deve mapear nas suas rotas que quando a requisição para esse URL seja encaminhada para o controle e ação correta. Nesse artigo não vou considerar o uso de MVC ou outra metodologia. Apenas vou ter 2 arquivos que vão implementar os recursos.</p>
<p>O REST trabalha com os códigos do protocolo HTTP e seus verbos, a seguir você vera os principais códigos de retorno e seus usos e os verbos utilizados. Uma coisa que é importante ressaltar é que o REST é principalmente semântico, assim dispensa muitos arquivos de documentação.</p>
<p>Principais códigos de retorno</p>
<p>O protocolo HTTP trabalha com classes de retorno que são 5, o numero inicial do código de retorno indica a classe de retorno, por exemplo o retorno 200 é da classe 2 que é sucesso.</p>
<p>Classes</p>
<ul>
<li> 1 – Continue, usando para continuar a mesma ação com varias requirições.</li>
<li> 2 – Sucesso.</li>
<li> 3 – Redirecionamento</li>
<li> 4 – Erro do cliente</li>
<li> 5 – Erro do servidor</li>
</ul>
<p>Códigos mais usados pelas aplicações REST</p>
<ul>
<li>200 – Sucesso, mais trivial resultado, usado por padrão</li>
<li>201 – Criado.</li>
<li>401 – Não autorizado, possivelmente porque não houve uma autenticação no servidor.</li>
<li>403 – Acesso negado</li>
<li>404 – Recurso não encontrado.</li>
<li>412 – Precondição falhou, quando um dado não foi informado ou informado de forma equivocada.</li>
<li>500 – Erro interno no servidor, geralmente usado quando uma exceção sem tratamento é lançada.</li>
<li>501 – Recurso não implementado, geralmente quando esta na especificação e não foi ainda implementado.</li>
</ul>
<p>Os verbos</p>
<ul>
<li>GET – usado para obter um recurso ou uma lista deles.</li>
<li>POST – usado para incluir um recurso</li>
<li>PUT – usado para editar um recurso</li>
<li>DELETE – usado para deletar um recurso</li>
</ul>
<p>O corpo da resposta pode ser em qualquer estrutura que você quiser. Usaremos a estrutura JSON, mas poderia ser XML ou outra estrutura, inclusive texto puro.</p>
<p>Os nossos arquivos conterão a seguinte estrutura:</p>
<p>/api/acount/index.php</p>
<p><code><br />
&lt;?<br />
/* Nossa classe de conta. */<br />
require_once 'Classe/Account.php';</code></p>
<p>$accounts = new Account();</p>
<p>/* verifica se p metodo é o GET */<br />
if ($_SERVER['REQUEST_METHOD'] == &#8216;GET&#8217;)<br />
{<br />
/*Caso seja, busca os dados do conta solicitada, caso não, toda  a lista */<br />
if ($_GET['id'])<br />
{<br />
$account = $account-&gt;find($$_GET['id'])-&gt;current();</p>
<p>/* verifica se o recursos existe */<br />
if ($account)<br />
{<br />
/*caso exista imprime uma estrutura json com a estrutura da conta */<br />
echo json_encode($account-&gt;toArray());<br />
}<br />
else<br />
{<br />
/* retorna o código de retorno 404, recursos não encontrado. */<br />
http_send_status(&#8217;404&#8242;);<br />
}<br />
}<br />
}<br />
elseif ($_SERVER['REQUEST_METHOD'] == &#8216;PUT&#8217;)<br />
{<br />
/* o método PUT é utilizado para editar um recurso */<br />
if ($_GET['id'])<br />
{<br />
$account = $accounts-&gt;find($_GET['id'])-&gt;current();<br />
if ($account)<br />
{<br />
$account-&gt;name = $_GET['name'];<br />
$account-&gt;email = $_GET['email'];</p>
<p>try<br />
{<br />
/* não precisamos mudar o código do retorno, pois será 200 */<br />
$account-&gt;save();<br />
}<br />
catch (Exception $e)<br />
{<br />
/* erro interno no servidor; */<br />
http_send_status(&#8217;500&#8242;);<br />
}</p>
<p>}<br />
else<br />
{<br />
/* retorna o código de retorno 404, recursos não encontrado. */<br />
http_send_status(&#8217;404&#8242;);<br />
}<br />
}<br />
else<br />
{<br />
/* se o recurso não foi indicado envia um erro de falha de precondição */<br />
http_send_status(&#8217;412&#8242;);<br />
}<br />
}<br />
else<br />
{<br />
/* acesso negado para os métodos POST e DELETE */<br />
http_send_status(&#8217;403&#8242;);<br />
}<br />
?&gt;<br />
O segundo recurso (Feed)que esta na URL http://nossorest.example.com/api/feed/ será usado para incluir, listar e deletar feeds de uma determinada conta.</p>
<p>/api/feed/inde.php<br />
<code><br />
&lt;?<br />
/*Nossa classe de conta.*/<br />
require_once 'Classe/Account.php';</code></p>
<p>$accounts = new Account();</p>
<p>/*verifica se o metodo é o GET*/<br />
if ($_SERVER['REQUEST_METHOD'] == &#8216;GET&#8217;)<br />
{<br />
/*Caso seja, busca os dados da conta solicitada*/<br />
if ($_GET['id'])<br />
{<br />
$account = $account-&gt;find($$_GET['id'])-&gt;current();</p>
<p>/*verifica se o recursos existe*/<br />
if ($account)<br />
{<br />
/*caso exista imprime uma estrutura json com a estrutura da conta*/<br />
echo json_encode($account-&gt;getFeeds());<br />
}<br />
else<br />
{<br />
/*retorna o código de retorno 404, recursos não encontrado.*/<br />
http_send_status(&#8217;404&#8242;);<br />
}<br />
}<br />
else<br />
{<br />
/*se o recurso não foi indicado envia um erro de falha de precondição*/<br />
http_send_status(&#8217;412&#8242;);<br />
}<br />
}<br />
elseif ($_SERVER['REQUEST_METHOD'] == &#8216;POST&#8217;)<br />
{<br />
/*Caso seja, busca os dados da conta*/<br />
if ($_GET['id'] and $_GET['feed'])<br />
{<br />
$account = $account-&gt;find($$_GET['id'])-&gt;current();</p>
<p>/*verifica se o recursos existe*/<br />
if ($account)<br />
{<br />
/*caso exista inclui a feed na lista da conta*/<br />
$account-&gt;addFeed($_GET['feed']);<br />
}<br />
else<br />
{<br />
/*retorna o código de retorno 404, recursos não encontrado.*/<br />
http_send_status(&#8217;404&#8242;);<br />
}<br />
}<br />
else<br />
{<br />
/*se o recurso não foi indicado envia um erro de falha de precondição*/<br />
http_send_status(&#8217;412&#8242;);<br />
}<br />
}<br />
elseif ($_SERVER['REQUEST_METHOD'] == &#8216;DELETE&#8217;)<br />
{<br />
/*o método PUT é utilizado para editar um recurso*/<br />
if ($_GET['id'] and $_GET['id_feed'])<br />
{<br />
$account = $accounts-&gt;find($_GET['id'])-&gt;current();<br />
if ($account)<br />
{<br />
$account-&gt;delFeed($_GET['id_feed']);<br />
}<br />
else<br />
{<br />
/*retorna o código de retorno 404, recursos não encontrado.*/<br />
http_send_status(&#8217;404&#8242;);<br />
}<br />
}<br />
else<br />
{<br />
/*se o recurso não foi indicado envia um erro de falha de precondição*/<br />
http_send_status(&#8217;412&#8242;);<br />
}<br />
}<br />
else<br />
{<br />
/*acesso negado para o método PUT*/<br />
http_send_status(&#8217;403&#8242;);<br />
}<br />
?&gt;<br />
Com esses exemplos práticos você já pode começar a imaginar como serão seus serviços e<br />
começar a mapeá-los. Durante essa semana estarei publicando mais artigos que elucidaram ainda mais como criar aplicações em PHP com REST e MVC com o Zend Framework.</p>
<p>Abraços,<br />
Fernando Chucre</p>
]]></content:encoded>
			<wfw:commentRss>http://horizontesdigitais.com/2008/04/29/rest-web-services-sem-wsdl-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integração PHP e .Net</title>
		<link>http://horizontesdigitais.com/2008/03/16/integracao-php-e-net/</link>
		<comments>http://horizontesdigitais.com/2008/03/16/integracao-php-e-net/#comments</comments>
		<pubDate>Sun, 16 Mar 2008 23:41:23 +0000</pubDate>
		<dc:creator>Fernando Chucre</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Phalanger]]></category>

		<guid isPermaLink="false">http://horizontesdigitais.com/2008/03/16/integracao-php-e-net/</guid>
		<description><![CDATA[Darwin já dizia que sobreviverá a espécie mais adaptável às modificações do ambiente. Pois é, estamos numa era que exige cada vez mais de nós programadores. Para continuar na área, somos exigidos a ser mais que programadores Java ou .Net, agora necessitamos conhecer cada vez mais linguagens &#8211; o JavaScript com Ajax que o diga. [...]]]></description>
			<content:encoded><![CDATA[<p>Darwin já dizia que sobreviverá a espécie mais adaptável às modificações do ambiente. Pois é, estamos numa era que exige cada vez mais de nós programadores. Para continuar na área, somos exigidos a ser mais que programadores Java ou .Net, agora necessitamos conhecer cada vez mais linguagens &#8211; o JavaScript com Ajax que o diga.</p>
<p>Atualmente a Microsoft está com uma ofensiva através do seu centro de migração de tecnologias para integrar PHP e .Net, fazendo com que os programadores entrem no mundo .Net e ali permaneçam. Uma das maneiras é utilizando o Phalanger, um compilador PHP para .Net. Ele é integrado ao Visual Studio e com apenas algumas modificações na linguagem conseguiu adaptar o PHP ao .Net. É uma ferramenta muito interessante, mas acredito que para alguns, como eu, usar um pacote .Net em nossas aplicações convencionais é muito mais. Nós utilizamos o .Net em nossas aplicações quando já existe um sistema de um cliente que tem sua regra de negócio no .Net ou quando uma biblioteca faz exatamente aquilo que a gente quer e não achamos disponível.</p>
<p>Se quiser saber mais sobre como usar o Phalanger acesse <a href="http://php-compiler.net/doku.php">http://php-compiler.net/doku.php</a>.</p>
<p>Agora, para saber mais como usar pacotes .Net numa plicação PHP nativa acesse <a href="http://www.php.net/manual/pt_BR/class.dotnet.php">http://www.php.net/manual/pt_BR/class.dotnet.php</a></p>
<p>Abraços!</p>
<p>Fernando Chucre</p>
]]></content:encoded>
			<wfw:commentRss>http://horizontesdigitais.com/2008/03/16/integracao-php-e-net/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
