<?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"
	>

<channel>
	<title>KaizenWeb</title>
	<atom:link href="http://kaizenweb.com.br/wordpress/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://kaizenweb.com.br/wordpress</link>
	<description>Hospedagem e Desenvolvimento de Sites</description>
	<pubDate>Mon, 01 Dec 2008 15:09:46 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Criando um FrameWork PHP do Zero Usando Padrões de Projeto (Parte 3)</title>
		<link>http://kaizenweb.com.br/wordpress/?p=77</link>
		<comments>http://kaizenweb.com.br/wordpress/?p=77#comments</comments>
		<pubDate>Sat, 29 Nov 2008 04:07:11 +0000</pubDate>
		<dc:creator>Everton Tavares</dc:creator>
		
		<category><![CDATA[Sem Categoria]]></category>

		<guid isPermaLink="false">http://kaizenweb.com.br/wordpress/?p=77</guid>
		<description><![CDATA[Todo bom FrameWork tem que nos dar a possibilidade de personalizá-lo, e um dos requisitos mais necessários de personalização é a URL, e nesse artigo será explicado como obter essa funcionalidade utilizando o padrão de projeto Strategy, que tem por objetivo trocar dinamicamente o comportamento da aplicação;

Como um exemplo para melhor entendimento do Padrão Strategy, [...]]]></description>
			<content:encoded><![CDATA[<p>Todo bom FrameWork tem que nos dar a possibilidade de personalizá-lo, e um dos requisitos mais necessários de personalização é a URL, e nesse artigo será explicado como obter essa funcionalidade utilizando o padrão de projeto <a href="http://en.wikipedia.org/wiki/Strategy_pattern">Strategy</a>, que tem por objetivo trocar dinamicamente o comportamento da aplicação;</p>
<p><span id="more-77"></span></p>
<p>Como um exemplo para melhor entendimento do Padrão <strong>Strategy</strong>, considere uma classe Guerreiro, que possui um método chamado lutar, onde nele ele utiliza de uma arma golpear os adversários; Porém existem vários tipos de armas (Espada, Machado, Lança, Arco/Flecha), e para ganhar uma guerra, deve-se ter vários tipos de armamentos distribuídos entre os guerreiros;</p>
<p>Como primeira idéia de implementação, vamos criar uma implementação Guerreiro padrão, e para cada tipo de armamento vamos estender a classe padrão sobrescrevendo o método lutar para utilizar outro armamento; Sendo assim temos:</p>
<p>Como primeira idéia de implementação,</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Guerreiro <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Outros métodos do Guerreiro</span>
	<span style="color: #339933;">...</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> lutar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Implementação da luta</span>
		<span style="color: #990000;">echo</span> <span style="">'lutando com os punhos'</span>;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Arqueiro <span style="color: #000000; font-weight: bold;">extends</span> Guerreiro <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> lutar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Implementação da luta</span>
		<span style="color: #990000;">echo</span> <span style="">'Atirando com o Arco'</span>;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Cavaleiro <span style="color: #000000; font-weight: bold;">extends</span> Guerreiro <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> lutar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Implementação da luta</span>
		<span style="color: #990000;">echo</span> <span style="">'Lutando com espada'</span>;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>De inicio parece uma boa solução, porém a luta não consiste apenas em golpear o adversário, mas sim de vários outros comportamentos que não depende da arma, e sendo assim, esse código ficará repetido em cada classe que estender a classe Guerreiro, o que não é uma boa solução, tendo em vista que na hora da alteração desse código, terá que passar em cada classe alterando o mesmo código;</p>
<p>Para melhorar solucionar esse problema, vamos aplicar o conceito do padrão Strategy, onde será mantida uma unica implementação de Guerreiro que receberá em seu construtor qualquer classe que implemente a interface Arma, que contem um método para realizar o golpe; Sendo assim:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Implementação de Guerreiro</span>
<span style="color: #000000; font-weight: bold;">class</span> Guerreiro <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$arma</span>;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span>Arma <span style="color: #000088;">$arma</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">arma</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$arma</span>;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Outros métodos do Guerreiro</span>
	<span style="color: #339933;">...</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> lutar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Implementação da luta</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">arma</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">golpear</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">interface</span> Arma <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> golpear<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> ArcoFlecha implements Arma <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> golpear<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">echo</span> <span style="">'Atirando com o arco'</span>;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Punho implements Arma <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> golpear<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">echo</span> <span style="">'Cabra macho luta com os punhos'</span>;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Espada implements Arma <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> golpear<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">echo</span> <span style="">'Lutando com a Espada'</span>;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Exemplo</span>
<span style="color: #000088;">$arqueiro</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Guerreiro<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ArcoFlecha<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #000088;">$cavaleiro</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Guerreiro<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Espada<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #000088;">$cabraMacho</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Guerreiro<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Punho<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>O padrão Strategy segue o padrão de Orientação a Objetos de <span style="text-decoration: underline;"><strong>encapsular o que varia</strong></span>, mantendo o codigo comum em um unico só lugar, ficando fácil a manutenção que, no nosso exemplo, basta implementar a interface Arma caso precisar de um novo tipo de arma na guerra; Outra vantagem vem da amplitude onde o problema pode ser expandido, ou seja, caso existam outro tipo de classe que lute com armas (um Pirata, por exemplo), não é necessário reimplementar todo o comportamento de luta com armas:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Pirata <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$arma</span>;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span>Arma <span style="color: #000088;">$arma</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">arma</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$arma</span>;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> invadirNavioInimigo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">arma</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">golpear</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$pirata</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Pirata<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Espada<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Aplicando esse conceito no framework, vamos alterar a forma como é lido os parâmetros que definem qual Module/Action que será acessada;</p>
<p>Utilizar variáveis GET para determinar qual action deve ser executada não é uma boa prática, e tornam &#8220;feias&#8221; as URLs do Sistema; Para isso, vamos aplicar o conceito de <a href="http://forum.imasters.uol.com.br/index.php?showtopic=203965">URLs amigáveis</a>, no lugar das variáveis GET; Assim, os valores do module e da action que será acessada no sistema, serão lidos diretamente da URL;</p>
<p>No Framework atual, a leitura dos parâmetros que decidem qual Command executar esta sendo feita atualmente dentro do Command_Factory juntamente com o código de carregar o Command; Nesse caso em particular, teremos que separar as duas funcionalidades, pois vai variar a forma que será recuperado os parâmetros para carregar os Command, e seguindo a definição do <strong>Strategy</strong>, vamos criar uma interface que irá descrever como que as implementações de leitura dos parâmetros deve fornecer os valores, assim o factory não irá se importar de qual implementação ele esta recuperando os parâmetros;</p>
<p>Com essa alteração, <span style="text-decoration: underline;"><strong>cada classe passa a ter sua responsabilidade bem definida</strong></span>, e sempre que se deseja mudar a forma como que os parâmetros devem ser lidos, basta criar uma classe que implementa a interface que realiza essa ação e passa-la pro Factory sem precisar mudar uma linha de código do Factory;</p>
<p>Nossa interface se chamará Command_Info, pois ela guardara as informações da URL de acesso, e terá dois métodos principais, que irá retornar o Modulo e a Action desejada, ficando da seguinte forma:</p>
<p>arquivo: /lib/Command/Info.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">interface</span> Command_Info <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//Método que retorna o Module</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getModule<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #666666; font-style: italic;">//Método que retorna a Action</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Vamos criar a nossa implementação padrão, que irá recuperar os parâmetros da mesma forma que estava sendo feita anteriormente:</p>
<p>arquivo: /lib/Command/Info/Default.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Command_Info_Default implements Command_Info <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// Retorna o valor do Module contido no GET</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getModule<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'module'</span><span style="color: #009900;">&#93;</span>;
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">// Retorna o valor da Action contigo no GET</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span>;
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>O Command_Factory receberá uma instância de alguma implementação de Command_Info por parâmetro, para então realizar a chamada ao Command correto; </p>
<p>arquivo: /lib/Command/Factory.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Command_Factory <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> createCommand<span style="color: #009900;">&#40;</span>Command_Info <span style="color: #000088;">$info</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
           <span style="color: #666666; font-style: italic;">//Se o module não for informado, ele passa a ser considerado o index;</span>
           <span style="color: #000088;">$module</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$info</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getModule</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$info</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getModule</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="">'index'</span>;
           <span style="color: #666666; font-style: italic;">//A mesma coisa para a action</span>
           <span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$info</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAction</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000000; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$info</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAction</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="">'index'</span>;
&nbsp;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Deixa a primeira letra em Maiusculo e o resto da string em minusculo</span>
          <span style="color: #000088;">$module</span> <span style="color: #339933;">=</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$module</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$action</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Cria o nome do arquivo da Action</span>
          <span style="color: #000088;">$fileName</span> <span style="color: #339933;">=</span> <span style="">'command/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$module</span><span style="color: #339933;">.</span><span style="">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="">'.php'</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Se o arquivo não existir, gera erro</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fileName</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               throw <span style="color: #000000; font-weight: bold;">new</span> Exception_Pagenotfound<span style="color: #009900;">&#40;</span><span style="">'Arquivo do Command não encontrado: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$fileName</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span>
          <span style="color: #666666; font-style: italic;">//Carrega o arquivo</span>
          <span style="color: #b1b100;">require_once</span> <span style="color: #000088;">$fileName</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//O nome da classe é a Action seguida da String Command</span>
          <span style="color: #000088;">$className</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="">'Command'</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Depois que o arquivo for adicionado, a classe deve existir, caso não existir, o arquivo carregado</span>
          <span style="color: #666666; font-style: italic;">//não contem o Command, então deve gerar outro erro; o parâmetro false no class_exists </span>
          <span style="color: #666666; font-style: italic;">//é informado para não carregar a classe utilizando o __autoload</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">class_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$className</span><span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               throw <span style="color: #000000; font-weight: bold;">new</span> Exception_Pagenotfound<span style="color: #009900;">&#40;</span><span style="">'Command não foi encontrado: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$className</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span>               
          <span style="color: #666666; font-style: italic;">//Carrega e retorna a Classe</span>
          <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000088;">$className</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Notem que não é obrigatório  a classe Strategy ser informadam no construtor, podendo ser informada como parâmetro do método; Vale tambem ressaltar que foi definido que o Command_Factory deve receber uma instância de Command_Info como parâmetro, e esse é um dos poucos casos onde o PHP trata o tipo da variável, que no nosso caso é essencial essa verificação de tipo, pois caso seja passado uma variável qualquer, o nosso Command_Factory não irá conseguir trabalhar corretamente;<br />
Agora que temos toda a estrutura separada e flexível a ponto de podemos personaliza-la, precisamos de uma maneira setar a configuração; Geralmente se utiliza arquivo texto (XML, YAML, etc) para essa configuração, mas no nosso caso vamos utilizar uma classe PHP, que na minha opinião é a melhor escolha, pois pula a etapa de abrir e ler um arquivo para armazenar as configurações em variáveis do PHP, tornando o sistema mais rápido;</p>
<p>Obs.: A forma de configuração utilizada nesse artigo não é apenas um exemplo, e sua implementação não faz parte do foco; Existem outras formas de fazer essa configuração, podendo você escolher a que mais lhe agrada <img src='http://kaizenweb.com.br/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>arquivo: lib/Config.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">//Arquivo de configuração do FrameWork</span>
<span style="color: #000000; font-weight: bold;">class</span> Config <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$commandInfo</span>;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> configure<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">//Configura a Classe que irá ler os parâmetros da URL</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">commandInfo</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Command_Info_Default<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Retorna o CommandInfo</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getCommandInfo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">commandInfo</span>;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>arquivo: index.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;">try <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//Inicia a configuração</span>
    <span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Config<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">configure</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #666666; font-style: italic;">//Instancia o Factory e Recupera o Command</span>
    <span style="color: #000088;">$factory</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Command_Factory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #000088;">$factory</span><span style="color: #339933;">-&amp;</span>gt;createCommand<span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCommandInfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt;execute<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Exception_Pagenotfound <span style="color: #000088;">$ep</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">echo</span> <span style="">'&lt;h1&gt;ERRO 404 - Página não encontrada&lt;/h1&gt;'</span>;
<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">echo</span> <span style="">'&lt;h1&gt;ERRO 500 - Erro na execução&lt;/h1&gt;'</span>;
<span style="color: #009900;">&#125;</span>
?<span style="color: #339933;">&amp;</span>gt;</pre></div></div>

<p>Vamos agora  a partir dessa nova estrutura, alterar o comportamento do FrameWork para utilizar URL amigáveis para acessar os command; Ja existem vários artigos disponíveis na web explicando passo a passo como criar Url&#8217;s amigáveis, e a implementação apresentada aqui será totalmente baseada no artigo disponível <a href="http://forum.imasters.uol.com.br/index.php?showtopic=203965">no fórum do iMasters e escrito por Perfect Lion</a>;</p>
<p>Antes de tudo, é necessário que o <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">modulo rewrite</a> do Apache esteja habilitado dentro do arquivo <strong>httpd.conf</strong>; Ele é o modulo responsável por redirecionar as requisições, sendo que, a forma de redirecionamento é definida através do arquivo <strong>.htaccess</strong>, que deve estar localizado na raiz do site;</p>
<p>A Url que vamos utilizar terá o seguinte formato:<br />
<code>http://www.endereco.qualquer/MODULE/ACTION</code> sendo que, caso nenhum dos dois for informado, será utilizado index como padrão;</p>
<p>A seguir, o código do .htaccess adaptado para utilizar no framework:</p>
<p><code><br />
# << URLs Amigaveis<br />
# verifica se o modulo rewrite está habilitado se sim executa o bloco dentro<br />
# habilita o modulo Rewrite<br />
RewriteEngine On<br />
# Foi comentada essa linha para que o rewrite funcione somente nos arquivos que estão no diretorio do .htaccess<br />
# RewriteBase /<br />
# Verifica se a url digitada é um arquivo caso seja para aqui<br />
RewriteCond %{REQUEST_FILENAME} !-f<br />
# Verifica se a url digitada é uma pasta caso seja para aqui<br />
RewriteCond %{REQUEST_FILENAME} !-d<br />
# Redireciona para o arquivo index.php caso nenhum desses comandos assim seja valido vai para ele.<br />
RewriteRule .(/)?$ index.php<br />
# >> URLs Amigaveis<br />
</code></p>
<p>Vamos agora adaptar a implementação do Perfect Lion para a nossa estrutura, criando assim a classe Command_Info_Rewrite;</p>
<p>arquivo: lib/Command/Info/Rewrite.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #0000ff; font-style: italic;">/**
 * Command_Info utilizando URL Amigável
 *
 * Código Original por Perfect Lion em http://forum.imasters.uol.com.br/index.php?showtopic=203965
 *
 * A unica alteração foi para que o script funcione quando estiver dentro de um diretório no servido, pois o 
 * script original funciona na raiz do servidor
 *
 * @author Everton Emilio Tavares
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> Command_Info_Rewrite implements Command_Info <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$gets</span>;
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Recupera o diretorio em que o sistema se encontra</span>
        <span style="color: #990000;">echo</span> <span style="color: #000088;">$diretorio</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="">'SCRIPT_FILENAME'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="">'DOCUMENT_ROOT'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,-</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span>;
        <span style="color: #666666; font-style: italic;">// Recupera a URI </span>
        <span style="color: #000088;">$uri</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;REQUEST_URI&quot;</span><span style="color: #009900;">&#93;</span>;
        <span style="color: #666666; font-style: italic;">// Recupera os dados da URI. esta sendo utilizada a mesma variável do artigo para melhor entendimento</span>
        <span style="color: #000088;">$gets</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/&quot;</span><span style="color: #339933;">,</span><span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strrchr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$uri</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;?&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$uri</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
        <span style="color: #666666; font-style: italic;">// Primeiro elemento sempre será em branco, então faz um array_shift para remove-lo</span>
        <span style="color: #990000;">array_shift</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gets</span><span style="color: #009900;">&#41;</span>;
        <span style="color: #666666; font-style: italic;">// Caso o sistema esteja em um diretório, é necessário remover o caminho de pastas do mesmo</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gets</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_slice</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$gets</span><span style="color: #339933;">,</span><span style="color: #990000;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="">'/'</span><span style="color: #339933;">,</span><span style="color: #000088;">$diretorio</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Retorna a primeira parte da URL como o Module</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getModule<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gets</span><span style="color: #009900;">&#91;</span><span style="color:#800080;">0</span><span style="color: #009900;">&#93;</span>;
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;">// Retorna a Segunda parte da URL como Action</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gets</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span>;
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Basta agora alterarmos a configuração do framework para utilizarmos  nossa nova classe:</p>
<p>arquivo: /config.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #0000ff; font-style: italic;">/**
 * Classe de Configuração do FrameWork
 * @author Everton Emilio Tavares
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> Config <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$commandInfo</span>;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> configure<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">//Configura a Classe que irá ler os parâmetros</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">commandInfo</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Command_Info_Rewrite<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Retorna o CommandInfo</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getCommandInfo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">commandInfo</span>;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Assim temos nosso Framework configurável e adaptável para qualquer situação e a qualquer tipo de URL sem modificar as classes do coração do FrameWork; É possível ainda possibilitar a configuração de outras partes do FrameWork, como a Factory de Commands, por exemplo;</p>
<p><a href='http://kaizenweb.com.br/wordpress/wp-content/uploads/parte3.rar'>Códigos desse Artigo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kaizenweb.com.br/wordpress/?feed=rss2&amp;p=77</wfw:commentRss>
		</item>
		<item>
		<title>Criando um FrameWork PHP do Zero Usando Padrões de Projeto (Parte 2)</title>
		<link>http://kaizenweb.com.br/wordpress/?p=29</link>
		<comments>http://kaizenweb.com.br/wordpress/?p=29#comments</comments>
		<pubDate>Sat, 25 Oct 2008 04:24:13 +0000</pubDate>
		<dc:creator>Everton Tavares</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Framework]]></category>

		<category><![CDATA[Padrões de Projeto]]></category>

		<guid isPermaLink="false">http://kaizenweb.com.br/wordpress/?p=29</guid>
		<description><![CDATA[Nessa parte da construção do FrameWork, não vamos utilizar padrões de projetos, e sim, vamos analisar as estruturas de tratamento de erros fornecidas pelo PHP, e escolher a abordagem que melhor se encaixa no FrameWork; Se você perdeu a primeira parte, pode ler ela clicando aqui;

Como foi observado, a nossa factory gera um erro quando [...]]]></description>
			<content:encoded><![CDATA[<p>Nessa parte da construção do FrameWork, não vamos utilizar padrões de projetos, e sim, vamos analisar as estruturas de tratamento de erros fornecidas pelo PHP, e escolher a abordagem que melhor se encaixa no FrameWork; Se você perdeu a primeira parte, pode ler ela <a href="http://kaizenweb.com.br/wordpress/?p=13">clicando aqui</a>;<br />
<span id="more-29"></span><br />
Como foi observado, a nossa factory gera um erro quando não encontra o command solicitado, e esse foi tratado utlilizando a função <a href="http://br2.php.net/die">die</a>, que interrompe a execução exibindo uma mensagem; esse tratamento é o tratamento básico que encontramos em diversos tutoriais de PHP espalhados pela net, e é eficaz para quando o erro ocorrido impede a continuação da execução;<br />
A desvantagem de utilizar esse método em um sistema &#8220;real&#8221;, é a falta de controle que temos sobre ele, pois a chamada a esta função finaliza a execução, exibe a mensagem para o usuário e só! não existe uma forma de mudar o comportamento para que possamos tratar o erro, gerar log, enviar a mensagem por email, etc&#8230; e sendo assim, o desenvolvedor vai ficar sabendo do erro através do usuário do sistema, o que não é uma idéia muito interessante;</p>
<p>Para tentar melhorar o tratamento de erros, vamos encapsular esse erro em uma função. Vamos chamá-la de <strong>erro(),</strong> e dentro dela vamos tratar a mensagem e vamos chamar o <strong>die</strong> para finalizar a execução; Assim teremos, mais ou menos, o seguinte formato:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> erro<span style="color: #009900;">&#40;</span><span style="color: #000088;">$mensagem</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">echo</span> <span style="">'&lt;h1&gt;Erro na execução do sistema&lt;/h1&gt;'</span>;
    <span style="color: #990000;">echo</span> <span style="">'Descrição do erro: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$mensagem</span>;
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Vamos aplicar ao nosso factory, para que um erro seja gerado caso o Command não for encontrado;<br />
arquivo: /lib/Command/Factory.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Command_Factory <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> createCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #666666; font-style: italic;">//Se o module não for informado, ele passa a ser considerado o index;</span>
          <span style="color: #000088;">$module</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'module'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'module'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="">'index'</span>;
          <span style="color: #666666; font-style: italic;">//A mesma coisa para a action</span>
          <span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="">'index'</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Deixa a primeira letra em Maiusculo e o resto da string em minusculo</span>
          <span style="color: #000088;">$module</span> <span style="color: #339933;">=</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$module</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$action</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Cria o nome do arquivo da Action</span>
          <span style="color: #000088;">$fileName</span> <span style="color: #339933;">=</span> <span style="">'command/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$module</span><span style="color: #339933;">.</span><span style="">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="">'.php'</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Se o arquivo existir, carrega-o, caso contrário gera erro</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fileName</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               <span style="color: #b1b100;">require_once</span> <span style="color: #000088;">$fileName</span>;
               <span style="color: #666666; font-style: italic;">//O nome da classe é a Action seguida da String Command</span>
               <span style="color: #000088;">$className</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="">'Command'</span>;
               <span style="color: #666666; font-style: italic;">//Carrega e retorna a Classe</span>
               <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000088;">$className</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
               <span style="color: #666666; font-style: italic;">//Chama nossa função personalizada para tratamentos de erro</span>
               erro<span style="color: #009900;">&#40;</span><span style="">'Command não encontrado!'</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Agora já temos um tratamento único para os erros. E dentro dessa função, pode-se executar uma função para mandar a mensagem de erro para o desenvolvedor por email, ou grava-la em um log; Porem para o desenvolvedor, esse tipo de informação não é algo muito útil. Se houver um erro que não acontece com uma certa freqüência, fica complicado para o desenvolvedor conseguir identificar e reproduzir o erro, pois não sabe o arquivo e o ponto do código que gerou o erro.</p>
<p>Portanto vamos adotar outra política de erros, que é a utilização da função <a href="http://br2.php.net/trigger_error">trigger_error</a>, que vem nativo no PHP desde a versão 4.0.1, e tem como objetivo gerar uma mensagem de erro com os niveis E_USER_ERROR,E_USER_WARNING, E_USER_NOTICE, sendo que desses, apenas o E_USER_ERROR termina a execução do sistema; Outro recurso que essa função oferece é a de omitir a notificação de determinados tipos de erros através da função <a href="http://br2.php.net/manual/pt_BR/function.error-reporting.php">error_reporting</a>, que recebe por parâmetro o nivel do erro que será exibido. Não vamos entrar em detalhes no funcionamento dessa função, mas caso você tenha interesse, pode-se ler o manual dela clicando <a href="http://br2.php.net/manual/pt_BR/function.error-reporting.php">aqui</a>; </p>
<p>Para capturar os erros gerados por essa função, deve-se criar uma outra função e configurá-la utilizando a função <a href="http://www.php.net/manual/en/function.set-error-handler.php">set_error_handler</a>, como a seguir:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> trata_erro<span style="color: #009900;">&#40;</span><span style="color: #000088;">$n_erro</span> <span style="color: #339933;">,</span> <span style="color: #000088;">$mensagem</span> <span style="color: #339933;">,</span> <span style="color: #000088;">$arquivo</span> <span style="color: #339933;">,</span> <span style="color: #000088;">$linha</span> <span style="color: #339933;">,</span> <span style="color: #000088;">$contexto</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">echo</span> <span style="">'&lt;h1&gt;Erro na execução do sistema&lt;/h1&gt;'</span>;
    <span style="color: #990000;">echo</span> <span style="">'Descrição do erro: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$mensagem</span><span style="color: #339933;">.</span><span style="">'&lt;br /&gt;'</span>;
    <span style="color: #990000;">echo</span> <span style="">'Local do erro: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$arquivo</span><span style="color: #339933;">.</span><span style="">' na linha '</span><span style="color: #339933;">.</span><span style="color: #000088;">$linha</span><span style="color: #339933;">.</span><span style="">''</span>;
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">set_error_handler</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;trata_erro&quot;</span><span style="color: #009900;">&#41;</span>;</pre></div></div>

<p>Os parametros recebidos pela função são:</p>
<ul>
<li>$n_erro - Tipo do Erro (E_USER_ERROR,E_USER_WARNING, E_USER_NOTICE)</li>
<li>$mensagem - Mensagem do Erro</li>
<li>$arquivo - Arquivo onde ocorreu o erro</li>
<li>$linha - Linha onde ocorreu o erro</li>
<li>$contexto - Variáveis que existiam no momento em que ocorreu o erro</li>
</ul>
<p>Com esse mecanismo se torna muito mais fácil para o desenvolvedor poder tratar e identificar os erros, pois temos agora informações do arquivo que gerou o erro, a linha e até as variáveis que existiam no momento que o erro foi lançado, podendo enviar essas informações por email, e/ou grava-las em um log para que possa ser identificada pelo desenvolvedor; Vamos portanto atualizar o nosso Factory;</p>
<p>arquivo: /lib/Command/Factory.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Command_Factory <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> createCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #666666; font-style: italic;">//Se o module não for informado, ele passa a ser considerado o index;</span>
          <span style="color: #000088;">$module</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'module'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'module'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="">'index'</span>;
          <span style="color: #666666; font-style: italic;">//A mesma coisa para a action</span>
          <span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="">'index'</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Deixa a primeira letra em Maiusculo e o resto da string em minusculo</span>
          <span style="color: #000088;">$module</span> <span style="color: #339933;">=</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$module</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$action</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Cria o nome do arquivo da Action</span>
          <span style="color: #000088;">$fileName</span> <span style="color: #339933;">=</span> <span style="">'command/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$module</span><span style="color: #339933;">.</span><span style="">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="">'.php'</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Se o arquivo existir, carrega-o, caso contrário gera erro</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fileName</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               <span style="color: #b1b100;">require_once</span> <span style="color: #000088;">$fileName</span>;
               <span style="color: #666666; font-style: italic;">//O nome da classe é a Action seguida da String Command</span>
               <span style="color: #000088;">$className</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="">'Command'</span>;
               <span style="color: #666666; font-style: italic;">//Carrega e retorna a Classe</span>
               <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000088;">$className</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
               <span style="color: #666666; font-style: italic;">//Lança erro como E_USER_ERROR para poder finalizar a execução</span>
               <span style="color: #990000;">trigger_error</span><span style="color: #009900;">&#40;</span><span style="">'Command não encontrado'</span><span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">E_USER_ERROR</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Com esse mecanismo o tratamento de erros parece ter ficado mais fácil, porém ainda podemos identificar algumas dificuldades; A primeira é que o erro lançado no Factory não é nada mais que um erro de página não encontrada (erro 404) e não deveria ser exibido para o usuário como um erro fatal;<br />
Também não é possível descobrir os passos feitos pelo usuário até a ocorrência do erro, ou seja, imagine a seguinte função que tem por responsabilidade dividir dois números:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> dividir<span style="color: #009900;">&#40;</span><span style="color: #000088;">$n1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$n2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$n2</span> <span style="color: #339933;">==</span> <span style="color:#800080;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">trigger_error</span><span style="color: #009900;">&#40;</span><span style="">'Não é possivel dividir por zero'</span><span style="color: #009900;">&#41;</span>;
   <span style="color: #b1b100;">return</span> <span style="color: #000088;">$n1</span> <span style="color: #339933;">/</span> <span style="color: #000088;">$n2</span>;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Essa função pode ser usada em vários lugares no sistema, e apenas pelo numero da linha e o nome do arquivo é impossível saber em qual das utilizações foi gerado o erro; Outra dificuldade existente é que quando o erro ocorre, a execução do sistema é interrompida imediatamente, e dependendo do erro ocorrido, não é desejável que isso ocorra, como é o caso do exemplo a seguir, onde a mensagem de boas vindas não será exibida caso o erro em dividir ocorra:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000088;">$n1</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'n1'</span><span style="color: #009900;">&#93;</span>;
<span style="color: #000088;">$n2</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'n2'</span><span style="color: #009900;">&#93;</span>;
<span style="color: #000088;">$valor</span> <span style="color: #339933;">=</span> dividir<span style="color: #009900;">&#40;</span><span style="color: #000088;">$n1</span><span style="color: #339933;">,</span><span style="color: #000088;">$n2</span><span style="color: #009900;">&#41;</span>;
<span style="color: #990000;">echo</span> <span style="">'Resultado: '</span><span style="color: #339933;">,</span><span style="color: #000088;">$valor</span><span style="color: #339933;">,</span><span style="">'&lt;br /&gt;'</span>;
<span style="color: #990000;">echo</span> <span style="">'Obrigado por visitar nosso site!'</span>;</pre></div></div>

<p>Sendo assim, vamos abordar um novo mecanismo de tratamento de erros, que são as <a href="http://br2.php.net/manual/pt_BR/language.exceptions.php">Exceptions</a>, que consiste em uma forma Orientada a Objetos para tratamento de exceções no sistema que já existia em diversas linguagens de programação, e que foi adicionado ao PHP somente a partir da versão 5; Se baseia em uma classe chamada <a href="http://br2.php.net/manual/pt_BR/class.exception.php">Exception</a> que deve ser lançada quando ocorrer um erro ou uma situação inesperada, e possui a possibilidade de existir um ponto de tratamento da exceção para que, quando uma exceção for lançada, a execução do sistema possa parar imediatamente e direcionar a execução para o ponto de tratamento da exceção, onde o sistema possa se recuperar do erro e continuar executando normalmente; Caso a exceção não for tratada, será executado um tratamento interno do PHP; Para entender melhor, veremos um exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Alterando a função dividir para a utilização de exception</span>
<span style="color: #000000; font-weight: bold;">function</span> dividir<span style="color: #009900;">&#40;</span><span style="color: #000088;">$n1</span><span style="color: #339933;">,</span><span style="color: #000088;">$n2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$n2</span> <span style="color: #339933;">==</span> <span style="color:#800080;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">//Código do erro (numero inteiro - opcional)</span>
        <span style="color: #000088;">$codigoDoErro</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span>;
        <span style="color: #666666; font-style: italic;">//Lançando a exceção, (throw = lançar)</span>
        throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Não é possivel dividir por zero&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$codigoDoErro</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$n1</span><span style="color: #339933;">/</span><span style="color: #000088;">$n2</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Inicia o bloco que terá as exceções tratadas</span>
try <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$n1</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'n1'</span><span style="color: #009900;">&#93;</span>;
    <span style="color: #000088;">$n2</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'n2'</span><span style="color: #009900;">&#93;</span>;
    <span style="color: #000088;">$valor</span> <span style="color: #339933;">=</span> dividir<span style="color: #009900;">&#40;</span><span style="color: #000088;">$n1</span><span style="color: #339933;">,</span><span style="color: #000088;">$n2</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #990000;">echo</span> <span style="">'Resultado: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$valor</span>;
<span style="color: #666666; font-style: italic;">//Qualquer exceção lançada dentro do bloco irá executar o bloco de código dentro do catch, onde $e é a exceção lançada no erro</span>
<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">echo</span> <span style="">'Não foi possivel calcular a divisão; Motivo: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$e</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="">'&lt;br /&gt;'</span>;
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//Ocorrendo ou não o erro, a mensagem de agradecimento será exibida</span>
<span style="color: #990000;">echo</span> <span style="">'Obrigado por visitar nosso site!'</span>;</pre></div></div>

<p>Qualquer exceção que for lançada dentro do bloco try vai direcionar a execução para o catch presente no final do bloco, que vai tratar a exceção e continuar a execução do sistema normalmente; Dentro da variável $e vem todas as informações do erro gerado, como a mensagem, o código, o arquivo/linha que gerou o erro; Também possui o &#8220;trace&#8221; da execução, que é um array contendo todos os métodos que foram executados juntamente com seus parâmetros, até chegar no erro lançado, que é uma informação muito útil para o desenvolvedor pois da a possibilidade de ter todos os passos do usuário até o acontecimento do erro; Para maior detalhes, veja a documentação da classe exception <a href="http://br2.php.net/manual/pt_BR/class.exception.php">aqui</a>;</p>
<p>Outra vantagem do exception é poder criar tipos de erro, e tratá-los de forma diferente; Para isso basta criar uma nova classe de exceção que estende a classe Exception padrão, e adicionar um catch que recebe a nova classe que você criou; Veja como fazer no seguinte exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Exceção personalizada para tratamento de erros aritméticos</span>
<span style="color: #000000; font-weight: bold;">class</span> ExcecaoAritmetica <span style="color: #000000; font-weight: bold;">extends</span> Exception <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//Valores que serão armazenados no momento de lançar a exceção, e que serão recuperados no tratamento da mesma</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$valor1</span><span style="color: #339933;">,</span><span style="color: #000088;">$valor2</span>;
    <span style="color: #666666; font-style: italic;">//Construtor personalizado recebendo os valores da exceção</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$mensagem</span><span style="color: #339933;">,</span><span style="color: #000088;">$codigo</span><span style="color: #339933;">,</span><span style="color: #000088;">$valor1</span><span style="color: #339933;">,</span><span style="color: #000088;">$valor2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$mensagem</span><span style="color: #339933;">,</span><span style="color: #000088;">$codigo</span><span style="color: #009900;">&#41;</span>;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">valor1</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$valor1</span>;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">valor2</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$valor2</span>;
   <span style="color: #009900;">&#125;</span>
   <span style="color: #666666; font-style: italic;">//Funções personalizadas para a exceção</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getValor1<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">valor1</span>;
   <span style="color: #009900;">&#125;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getValor2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">valor2</span>;
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Função dividir lançando exceção especifica</span>
<span style="color: #000000; font-weight: bold;">function</span> dividir<span style="color: #009900;">&#40;</span><span style="color: #000088;">$n1</span><span style="color: #339933;">,</span><span style="color: #000088;">$n2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$n2</span> <span style="color: #339933;">==</span> <span style="color:#800080;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$codigoDoErro</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span>;
        <span style="color: #666666; font-style: italic;">//Lançando a exceção </span>
        throw <span style="color: #000000; font-weight: bold;">new</span> ExcecaoAritmetica<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Não é possivel dividir por zero&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$codigoDoErro</span><span style="color: #339933;">,</span><span style="color: #000088;">$n1</span><span style="color: #339933;">,</span><span style="color: #000088;">$n2</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$n1</span><span style="color: #339933;">/</span><span style="color: #000088;">$n2</span>;
<span style="color: #009900;">&#125;</span>
try <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$n1</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'n1'</span><span style="color: #009900;">&#93;</span>;
    <span style="color: #000088;">$n2</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'n2'</span><span style="color: #009900;">&#93;</span>;
    <span style="color: #000088;">$valor</span> <span style="color: #339933;">=</span> dividir<span style="color: #009900;">&#40;</span><span style="color: #000088;">$n1</span><span style="color: #339933;">,</span><span style="color: #000088;">$n2</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #990000;">echo</span> <span style="">'Resultado: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$valor</span>;
<span style="color: #666666; font-style: italic;">//Exceções Aritméticas será tratada aqui</span>
<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>ExcecaoMatematica <span style="color: #000088;">$em</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">echo</span> <span style="">'Ocorreu um erro aritmético: '</span><span style="color: #339933;">,</span><span style="color: #000088;">$em</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="">'&lt;br /&gt;'</span>;
    <span style="color: #666666; font-style: italic;">//Utilizando as funções personalizadas</span>
    <span style="color: #990000;">echo</span> <span style="">'valores informados: '</span><span style="color: #339933;">,</span><span style="color: #000088;">$em</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getValor1</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="">' e '</span><span style="color: #339933;">,</span><span style="color: #000088;">$em</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getValor2</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="">'&lt;br /&gt;'</span>;
    <span style="color: #666666; font-style: italic;">//Demais tratamentos pertinentes</span>
<span style="color: #666666; font-style: italic;">//As outras exceções serão tratadas aqui</span>
<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">echo</span> <span style="">'Ocorreu um erro desconhecido; Motivo: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$e</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="">'&lt;br /&gt;'</span>;
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">//Ocorrendo ou não o erro, a mensagem de agradecimento será exibida</span>
<span style="color: #990000;">echo</span> <span style="">'Obrigado por visitar nosso site!'</span>;</pre></div></div>

<p>Podemos notar que essa é a melhor opção para o nosso tratamento de erros; então vamos aplicá-la no nosso framework; Primeiramente vamos criar uma nova exceção chamada Exception_Pagenotfound, que será utilizada no Factory de Command e tem por objetivo informar que uma página não foi encontrada;</p>
<p>arquivo: lib/Exception/Pagenotfound.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Classe apenas para identificar o tipo do erro</span>
<span style="color: #000000; font-weight: bold;">class</span> Exception_Pagenotfound <span style="color: #000000; font-weight: bold;">extends</span> Exception <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//Recebe obrigatoriamente a mensagem, e o codigo pode ser omitido</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$mensagem</span><span style="color: #339933;">,</span><span style="color: #000088;">$codigo</span> <span style="color: #339933;">=</span> <span style="color:#800080;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
        parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$mensagem</span><span style="color: #339933;">,</span><span style="color: #000088;">$codigo</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>O nosso command ficará da seguinte forma:</p>
<p>arquivo: /lib/Command/Factory.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Command_Factory <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> createCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #666666; font-style: italic;">//Se o module não for informado, ele passa a ser considerado o index;</span>
          <span style="color: #000088;">$module</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'module'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'module'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="">'index'</span>;
          <span style="color: #666666; font-style: italic;">//A mesma coisa para a action</span>
          <span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="">'index'</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Deixa a primeira letra em Maiusculo e o resto da string em minusculo</span>
          <span style="color: #000088;">$module</span> <span style="color: #339933;">=</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$module</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$action</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Cria o nome do arquivo da Action</span>
          <span style="color: #000088;">$fileName</span> <span style="color: #339933;">=</span> <span style="">'command/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$module</span><span style="color: #339933;">.</span><span style="">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="">'.php'</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Se o arquivo não existir, gera erro</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fileName</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               throw <span style="color: #000000; font-weight: bold;">new</span> Exception_Pagenotfound<span style="color: #009900;">&#40;</span><span style="">'Arquivo do Command não encontrado: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$fileName</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span>
          <span style="color: #666666; font-style: italic;">//Carrega o arquivo</span>
          <span style="color: #b1b100;">require_once</span> <span style="color: #000088;">$fileName</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//O nome da classe é a Action seguida da String Command</span>
          <span style="color: #000088;">$className</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="">'Command'</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Depois que o arquivo for adicionado, a classe deve existir, caso não existir, o arquivo carregado</span>
          <span style="color: #666666; font-style: italic;">//não contem o Command, então deve gerar outro erro; o parametro false no class_exists </span>
          <span style="color: #666666; font-style: italic;">//é informado para não carregar a classe utilizando o __autoload</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">class_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$className</span><span style="color: #339933;">,</span><span style="color: #000000; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               throw <span style="color: #000000; font-weight: bold;">new</span> Exception_Pagenotfound<span style="color: #009900;">&#40;</span><span style="">'Command não foi encontrado: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$className</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span>               
          <span style="color: #666666; font-style: italic;">//Carrega e retorna a Classe</span>
          <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000088;">$className</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>O tratamento de erros ficará dentro do index.php, onde toda a exceção ocorrida no processo de carregar o Command e excecutá-lo será tratado utilizando um catch para cada tipo de exceção. Note que a classe Exception padrão do PHP deve vir por ultimo, porque senão o tratamento para as classes específicas não serão executados;</p>
<p>arquivo: index.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">function</span> __autoload<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nomeClasse</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">require_once</span> <span style="">'lib/'</span><span style="color: #339933;">.</span><span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="">'/'</span><span style="color: #339933;">,</span><span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="">'_'</span><span style="color: #339933;">,</span><span style="color: #000088;">$nomeClasse</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="">'.php'</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
try <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$factory</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Command_Factory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
    <span style="color: #000088;">$factory</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Exception_Pagenotfound <span style="color: #000088;">$ep</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">echo</span> <span style="">'&lt;h1&gt;ERRO 404 - Página não encontrada&lt;/h1&gt;'</span>;
    <span style="color: #666666; font-style: italic;">//O tratamento do Erro não vai ser abordado neste artigo</span>
<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">echo</span> <span style="">'&lt;h1&gt;ERRO 500 - Erro na execução&lt;/h1&gt;'</span>;
    <span style="color: #666666; font-style: italic;">//O tratamento do Erro não vai ser abordado neste artigo</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>A seguir veremos um exemplo de Exception funcionando dentro de um Command:</p>
<p>LerNoticia.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> LerNoticiaCommand implements Command <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> execute <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #666666; font-style: italic;">//Se não conseguir conectar, lança exceção</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="">'localhost'</span><span style="color: #339933;">,</span><span style="">'usuario'</span><span style="color: #339933;">,</span><span style="">'senha'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
              throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="">'Não foi possivel conectar com o banco de dados'</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span>
          <span style="color: #666666; font-style: italic;">//Se não conseguir selecionar o banco, lança exceção tambem</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="">'banco'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="">'Não foi possivel selecionar o banco de dados'</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span>
          <span style="color: #000088;">$id_da_noticia</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'id'</span><span style="color: #009900;">&#93;</span>;
          <span style="color: #666666; font-style: italic;">//Verifica se o id passado é um numero </span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_numeric</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id_da_noticia</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
              throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="">'Parâmetro Inválido: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$id_da_noticia</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span>
&nbsp;
          <span style="color: #666666; font-style: italic;">//Realiza a busca da Noticia</span>
          <span style="color: #000088;">$noticia</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="">'Select * From Noticia Where id = '</span><span style="color: #339933;">.</span><span style="color: #000088;">$id_da_noticia</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #666666; font-style: italic;">//Se não existe a noticia, lança exceção de pagina não encontrada</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">mysql_num_rows</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$noticia</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color:#800080;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
              throw <span style="color: #000000; font-weight: bold;">new</span> Exception_Pagenotfound<span style="color: #009900;">&#40;</span><span style="">'Noticia com id '</span><span style="color: #339933;">.</span><span style="color: #000088;">$id_da_noticia</span><span style="color: #339933;">.</span><span style="">' não existe'</span>;
          <span style="color: #009900;">&#125;</span>
          <span style="color: #666666; font-style: italic;">//Continua com a exibição da noticia</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Portando, podemos perceber que as exceções contem uma gama de recursos que facilitam bastante a vida do programador tanto na correção do erro (informações sobre o erro gerado), no tratamento da ocultação do erro (realizar algum caminho alternativo dentro do catch caso o erro ocorra) e na exibição do erro (exibir de forma diferente determinados tipos de erro), agregando muito mais segurança e praticidade no tratamento de erros no Framework;</p>
<p><a href='http://kaizenweb.com.br/wordpress/wp-content/uploads/artigo-framework-parte-2.zip'>Faça o download do resultado final do artigo clicando aqui.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kaizenweb.com.br/wordpress/?feed=rss2&amp;p=29</wfw:commentRss>
		</item>
		<item>
		<title>Criando um FrameWork PHP do Zero Usando Padrões de Projeto (Parte 1)</title>
		<link>http://kaizenweb.com.br/wordpress/?p=13</link>
		<comments>http://kaizenweb.com.br/wordpress/?p=13#comments</comments>
		<pubDate>Thu, 02 Oct 2008 01:45:01 +0000</pubDate>
		<dc:creator>Everton Tavares</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Framework]]></category>

		<category><![CDATA[Orientação a Objetos]]></category>

		<category><![CDATA[Padrões de Projeto]]></category>

		<guid isPermaLink="false">http://kaizenweb.com.br/wordpress/?p=13</guid>
		<description><![CDATA[Hoje em dia, para um bom desenvolvimento de softwares em PHP é imprescindível o uso de um Framework. Existe vários disponíveis, dentre eles podemos citar: Symfony; Prado; Zend; Cake, etc. Mas mesmo com tantos frameworks disponíveis atualmente, será que vale a pena o desenvolvimento de mais um framework? Realmente não compensa, já que quase todos [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje em dia, para um bom desenvolvimento de softwares em PHP é imprescindível o uso de um Framework. Existe vários disponíveis, dentre eles podemos citar: Symfony; Prado; Zend; Cake, etc. Mas mesmo com tantos frameworks disponíveis atualmente, será que vale a pena o desenvolvimento de mais um framework? Realmente não compensa, já que quase todos os frameworks já possui uma quantidade grande de usuários e de sistemas desenvolvidos, fazendo com que esses frameworks sejam confiáveis e robustos; </p>
<p>Mas o interessante de se desenvolver seu próprio framework é conhecer o funcionamento do mesmo, e aprender os mecanismos por trás dele para que o nivel de programação do seu código possa ser elevado; Portanto o objetivo principal deste artigo é desenvolver um Framework, para que possa, através da  codificação do mesmo compreender os princípios básicos dos frameworks em geral, e conhecer um pouco mais de padrões de Projeto;</p>
<p>Como a maioria dos Frameworks da atualidade, vamos o implementar através do padrão<a href="http://pt.wikipedia.org/wiki/MVC"> MVC, (Model-View-Controller), que visa separar as camadas de Dados, de Visão e de Controle de forma intercambiável. </a> Na primeira parte vamos desenvolver a parte inicial do Controller que é o responsável pelo fluxo das informações dentro do sistema.</p>
<p>Para muitas pessoas que programam em PHP, a codificação se da em um único arquivo, onde a ação a ser executada era definida a partir de uma variável GET e de IF, que direciona a execução do código dependendo do valor dessa variável; Se for analisar esse código, podemos considerar isso como um pequeno controller, sendo que é a partir dessa idéia iremos desenvolver o Framework;<br />
<span id="more-13"></span><br />
Sendo assim, a seguir temos nossa primeira versão do nosso Controller, que está &#8220;controlando&#8221; as actions de um mini-sistema de noticia:</p>
<p>Arquivo: noticias.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$acao</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_</span> GET<span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span>;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$acao</span> <span style="color: #339933;">==</span> <span style="">'ler'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #000088;">$id_da_noticia</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'id'</span><span style="color: #009900;">&#93;</span>;
     <span style="color: #990000;">echo</span> <span style="">'Lendo a noticia de id '</span><span style="color: #339933;">.</span><span style="color: #000088;">$id_da_noticia</span>;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$acao</span> <span style="color: #339933;">==</span> <span style="">'formulario'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #990000;">echo</span> <span style="">'Formulário de Cadastro de Noticia'</span>;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #990000;">echo</span> <span style="">'Home das Noticias'</span>;
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>A idéia aqui é intuitiva: Para cadastrar uma nova noticia, invoca-se a URL: noticia.php?action=formulario. Caso o parâmetro action for omitido, ou tiver um valor inválido será exibida uma página listando todas as Noticias cadastradas, que é sera Home do sistema de noticias;</p>
<p>O código é funcional, mantém tudo em um único lugar,  porém durante as manutenções, o caos aparece. Com o aumento de tamanho ficará complicado se localizar dentro do arquivo, tanto para encontrar o local para uma correção como para adicionar uma nova action. A fim de conseguir uma melhor organização, vamos começar separando as ações em funções, e em seguida, um switch é utilizado para direcionar o fluxo da aplicação para a função desejada:</p>
<p>Arquivo: noticias.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> home<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #990000;">echo</span> <span style="">'Home das Noticias'</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> ler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #000088;">$id_da_noticia</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'id'</span><span style="color: #009900;">&#93;</span>;
     <span style="color: #990000;">echo</span> <span style="">'Lendo a noticia de id '</span><span style="color: #339933;">.</span><span style="color: #000088;">$id_da_noticia</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> formulario<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #990000;">echo</span> <span style="">'Formulário de Cadastro de Noticia'</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #b1b100;">case</span> <span style="">'formulario'</span><span style="color: #339933;">:</span> formulario<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;break;
     <span style="color: #b1b100;">case</span> <span style="">'ler'</span><span style="color: #339933;">:</span> ler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>; <span style="color: #b1b100;">break</span>;
     <span style="color: #000000; font-weight: bold;">default</span><span style="color: #339933;">:</span> home<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>; <span style="color: #b1b100;">break</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Aparentemente nosso código está significativamente mais legível. Porém o problema da manutenção ainda permanece, o arquivo ficará maior que o da versão anterior, devido a todas as functions que deverão ser criadas; Para melhorar essa organização, vamos separar as funções em arquivos, e incluí-los conforme a action requisitada:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_</span> GET<span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #b1b100;">case</span> <span style="">'formulario'</span><span style="color: #339933;">:</span>
          <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="">'formulario.php'</span><span style="color: #009900;">&#41;</span>;
          formulario<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #b1b100;">break</span>;
     <span style="color: #b1b100;">case</span> <span style="">'ler'</span><span style="color: #339933;">:</span>
          <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="">'ler.php'</span><span style="color: #009900;">&#41;</span>;
          ler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #b1b100;">break</span>;
     <span style="color: #000000; font-weight: bold;">default</span><span style="color: #339933;">:</span>
          <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="">'home.php'</span><span style="color: #009900;">&#41;</span>;
          home<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #b1b100;">break</span>;
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>O código acima aumentou a ainda mais a legibilidade porém a manutenção ainda é trabalhosa pois necessitamos realizar manualmente os includes dos arquivos das funções, o que não é nada empolgante, e caso o nome do arquivo incluído esteja errado, aparecerá um erro, para melhorar esse cenário, vamos adicionar orientação a objetos no nosso código, e também utilizar o <a href="http://www.etecnologia.com.br/etutorial.html#command">padrão de projeto Command</a>;</p>
<p>Esse padrão de projeto, como o próprio nome diz, trata-se de criar classes de comandos, que podem ser executados independentemente ou agrupadas, fornecendo a flexibilidade de serem alternadas em tempo de execução sem muitas mudanças; Cada classe Command implementa uma única interface, que contem um único método, como descrito a seguir:</p>
<p>arquivo: Command.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">interface</span> Command <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> execute <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Para não nos preocuparmos com os includes, utilizaremos a função __autoload, que tem por responsabilidade, carregar todas as classes que ainda não foram carregadas dentro do script atual; Para maiores informações, <a href="http://br2.php.net/__autoload">veja no site do PHP</a>; Para podermos utiliza-la, o nome do arquivo deve ser padronizado com o nome da Classe. Sendo assim, definimos que o nome da classe sera o nome do arquivo, seguido da string &#8216;Command&#8217;;</p>
<p>Assim teremos:<br />
Formulario.php = FormularioCommand<br />
LerNoticia.php = LerNoticiaCommand<br />
HomeNoticia.php = HomeNoticiaCommand</p>
<p>Como exemplo, vamos criar o Command para a ação de leitura:</p>
<p>LerNoticia.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> LerNoticiaCommand implements Command <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> execute <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000088;">$id_da_noticia</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'id'</span><span style="color: #009900;">&#93;</span>;
          <span style="color: #990000;">echo</span> <span style="">'Lendo a noticia de id '</span><span style="color: #339933;">.</span><span style="color: #000088;">$id_da_noticia</span>;
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Simples não? Outra vantagem dessa abordagem é que, se algum curioso tentar acessar o arquivo LerNoticia.php diretamente, ele não irá ver nada, ja que a classe LerNoticiaCommand necessita ser invocada para ser executada;</p>
<p>Assim nosso Controller fica mais simplificado:</p>
<p>arquivo: noticia.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Incluindo a interface command, necessária para os command das Action</span>
<span style="color: #b1b100;">require_once</span> <span style="">'command.php'</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> __autoload<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nomeClasse</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #000088;">$nomeArquivo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$nomeClasse</span><span style="color: #339933;">,</span><span style="color:#800080;">0</span><span style="color: #339933;">,-</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="">'.php'</span>;
     <span style="color: #b1b100;">require_once</span> <span style="color: #000088;">$nomeArquivo</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_</span> GET<span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #b1b100;">case</span> <span style="">'formulario'</span><span style="color: #339933;">:</span> <span style="color: #000088;">$command</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> FormularioCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;break;
     <span style="color: #b1b100;">case</span> <span style="">'ler'</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$command</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> LerNoticiaCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;break;
     <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$command</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HomeNoticiaCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;break;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$command</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>O controller ja está bastante prático no momento. Para criarmos uma nova action, basta:</p>
<ol>
<li>Criar um arquivo com uma classe que implemente a interface Command;</li>
<li>Adicioná-lo no switch para que ele seja encontrado.</li>
</ol>
<p>Mas é necessário ainda umas mudanças na organização interna para adaptá-lo nos moldes da orientação a objetos, e um dos principios básico desta abordagem é que devemos separar o que muda do que é estático, e no nosso caso, a parte do código que está sempre em alteração, no período de desenvolvimento, é o switch que diz qual command vai ser executado em qual action; e para separar essa funcionalidade, vamos utilizar mais um padrão de projeto, chamado Factory, que é uma classe cujo papel é instanciar e retornar um Command para a execução, dependendo dos parâmetros informados pela URL. Mais detalhes sobre o padrão factory você pode obter aqui;</p>
<p>Vamos tambem padronizar o nome da factory para que o __autoload possa encontrá-lo, fazendo com que o nome da classe seja o caminho de diretórios dela, separados pelo caractere underline (&#8217;_'), além disso vamos separá-las em um diretório específico do nosso framework, que chamaremos de lib; e tambem separaremos as classes de Controller, adicionando-as em um diretório específo, chamado &#8216;command&#8217;;</p>
<p>Nossa Factory terá o seguinte formato:</p>
<p>arquivo: lib/Command/Factory.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Command_Factory <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> createCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_</span> GET<span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               <span style="color: #b1b100;">case</span> <span style="">'formulario'</span><span style="color: #339933;">:</span> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> FormularioCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
               <span style="color: #b1b100;">case</span> <span style="">'ler'</span> <span style="color: #339933;">:</span> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> LerNoticiaCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
               <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #339933;">:</span> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> HomeNoticiaCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>e o nosso novo __autoload, juntamente com o novo controller, ficará assim</p>
<p>arquivo: noticia.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> __autoload<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nomeClasse</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #666666; font-style: italic;">//Se a classe terminar com Command, carrega o arquivo da maneira 'antiga';</span>
     <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$nomeClasse</span><span style="color: #339933;">,-</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="">'Command'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000088;">$nomeArquivo</span> <span style="color: #339933;">=</span> <span style="">'command/'</span><span style="color: #339933;">.</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$nomeClasse</span><span style="color: #339933;">,</span><span style="color:#800080;">0</span><span style="color: #339933;">,-</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="">'.php'</span>;
     <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000088;">$nomeArquivo</span> <span style="color: #339933;">=</span> <span style="">'lib/'</span><span style="color: #339933;">.</span><span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="">'/'</span><span style="color: #339933;">,</span><span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="">'_'</span><span style="color: #339933;">,</span><span style="color: #000088;">$nomeClasse</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="">'.php'</span>;
     <span style="color: #009900;">&#125;</span>
     <span style="color: #b1b100;">require_once</span> <span style="color: #000088;">$nomeArquivo</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$factory</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Command_Factory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #000088;">$factory</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>E se quisermos ter, alem das noticias, um sistema para exibição de galeria de fotos no site? teremos que criar outro Factory? outro Controller?<br />
R.: Não! podemos mudar nossa factory para que possa adicionar mais tipos de &#8217;subsistemas&#8217; no framework;</p>
<p>Para tanto necessitaremos de parametro adicional na URL que será chamado de &#8216;module&#8217;; Nossa Factory terá que ler esses dois parâmetros para direcionar o fluxo de informações ao Command correto; Sendo assim:</p>
<p>arquivo: lib/Command/Factory.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Command_Factory <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> createCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'module'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               <span style="color: #b1b100;">case</span> <span style="">'noticia'</span><span style="color: #339933;">:</span>
                    <span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_</span> GET<span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                         <span style="color: #b1b100;">case</span> <span style="">'formulario'</span><span style="color: #339933;">:</span> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> FormularioCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
                         <span style="color: #b1b100;">case</span> <span style="">'ler'</span> <span style="color: #339933;">:</span> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> LerNoticiaCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
                         <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #339933;">:</span> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> HomeNoticiaCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
                    <span style="color: #009900;">&#125;</span>
               <span style="color: #b1b100;">case</span> <span style="">'galeria'</span><span style="color: #339933;">:</span>
                    <span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_</span> GET<span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                         <span style="color: #b1b100;">case</span> <span style="">'vergaleria'</span><span style="color: #339933;">:</span> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> VerGaleriaCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
                         <span style="color: #b1b100;">case</span> <span style="">'verfoto'</span> <span style="color: #339933;">:</span> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> VerFotoCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
                         <span style="color: #000000; font-weight: bold;">default</span> <span style="color: #339933;">:</span> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> HomeGaleriaCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
                    <span style="color: #009900;">&#125;</span>
               <span style="color: #000000; font-weight: bold;">default</span><span style="color: #339933;">:</span> <span style="">'index'</span><span style="color: #339933;">:</span> <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> IndexCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Agora que o nosso controller não é mais específico para noticias, podemos renomea-lo para index.php, fazendo com que seja a pagina principal do sistema;</p>
<p>Poderiamos finalizar nosso controller por aqui, porém ele pode ser melhorado na parte da configuração dos Command, substituindo o switch por um arquivo de configuração (XML, YML, properties), ou podemos simplismente suprimir o switch, fazendo com que a factory encontre a classe Command conforme a estrutura de diretórios. Assim, vamos fazer com que a classe do Command esteja armazenada em um diretório com o nome do modulo a qual ela pertence;</p>
<p>Esse tipo de configuração é chamado de configuração por convenção, que é a que será utilizada no Controller que estamos desenvolvendo; e é preferível, pois a configuração das actions da-se na existência de um único arquivo, que é o próprio arquivo do Command; Vejamos como fica o Command_Factory com esse comportamento:</p>
<p>arquivo: /lib/Command/Factory.php</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Command_Factory <span style="color: #009900;">&#123;</span>
     <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> createCommand<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #666666; font-style: italic;">//Se o module não for informado, ele passa a ser considerado o index;</span>
          <span style="color: #000088;">$module</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'module'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'module'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="">'index'</span>;
          <span style="color: #666666; font-style: italic;">//A mesma coisa para a action</span>
          <span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="">'action'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="">'index'</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Deixa a primeira letra em Maiusculo e o resto da string em minusculo</span>
          <span style="color: #666666; font-style: italic;">//Conforme dica de André Caldas, foi adicionado o comando htmlspecialchars para evitar</span>
          <span style="color: #666666; font-style: italic;">//SQL Injection</span>
          <span style="color: #000088;">$module</span> <span style="color: #339933;">=</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$module</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$action</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Cria o nome do arquivo da Action</span>
          <span style="color: #000088;">$fileName</span> <span style="color: #339933;">=</span> <span style="">'command/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$module</span><span style="color: #339933;">.</span><span style="">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="">'.php'</span>;
&nbsp;
          <span style="color: #666666; font-style: italic;">//Se o arquivo existir, carrega-o, caso contrário gera erro</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fileName</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               <span style="color: #b1b100;">require_once</span> <span style="color: #000088;">$fileName</span>;
               <span style="color: #666666; font-style: italic;">//O nome da classe é a Action seguida da String Command</span>
               <span style="color: #000088;">$className</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="">'Command'</span>;
               <span style="color: #666666; font-style: italic;">//Carrega e retorna a Classe</span>
               <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000088;">$className</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
               <span style="color: #666666; font-style: italic;">//Não vou me preocupar com o tratamento de erros agora, isso será abordado nos           proximos artigos</span>
               <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="">'Erro 404 - Página não encontrada'</span><span style="color: #009900;">&#41;</span>;
          <span style="color: #009900;">&#125;</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Tambem é necessário mudar a função __autoload, ja que o carregamento da classe do Command fica agora por responsabilidade da Factory.</p>
<p>arquivo: index.php</p>

<div class="wp_syntax"><div class="code"><pre class="language" style="font-family:monospace;">&lt;?php
function __autoload($nomeClasse) {
require_once 'lib/'.implode('/',explode('_',$nomeClasse)).'.php';
}
&nbsp;
$factory = new Command_Factory();
$factory-&gt;createCommand()-&gt;execute();
&nbsp;
?&gt;</pre></div></div>

<p>Arvore de diretório final:</p>
<ul>
<li>/</li>
<li>index.php</li>
<li>lib/
<ul>
<li>Command.php</li>
<li>Command/
<ul>
<li>Factory.php</li>
</ul>
</li>
</ul>
</li>
<li>Command/
<ul>
<li>Noticia/
<ul>
<li>Lernoticia.php</li>
<li>Index.php</li>
<li>Listar.php</li>
</ul>
</li>
<li>Galeria/
<ul>
<li>Index.php</li>
<li>Vergaleria.php</li>
<li>Verfoto.php</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Com esse recurso, a manutenção do código fica somente por conta dos Commands. Para adicionar um novo, basta apenas criar o arquivo com a classe implementando a interface Command e adicionar no diretório do módulo específico. Muito prático, e rápido; Com esses artifícios ja da para começar a usar o Controller, mas ainda temos muito a fazer;</p>
<p><em>Editado: Conforme dica de André Caldas, foi adicionado o comando htmlspecialchars no Factory, afim de evitar códigos maliciosos vindos via URL</em></p>
<p><a href='http://kaizenweb.com.br/wordpress/wp-content/uploads/artigo-framework-parte-1.zip'>Clique aqui para fazer o Download do código gerado nessa primeira parte;</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kaizenweb.com.br/wordpress/?feed=rss2&amp;p=13</wfw:commentRss>
		</item>
		<item>
		<title>Primeiro Post</title>
		<link>http://kaizenweb.com.br/wordpress/?p=1</link>
		<comments>http://kaizenweb.com.br/wordpress/?p=1#comments</comments>
		<pubDate>Mon, 29 Sep 2008 23:54:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Sem Categoria]]></category>

		<category><![CDATA[kaizenweb]]></category>

		<guid isPermaLink="false">http://kaizenweb.com.br/wordpress/?p=1</guid>
		<description><![CDATA[É com esse POST que é dado o pontapé inicial no mais novo site da KaizenWeb;
]]></description>
			<content:encoded><![CDATA[<p>É com esse POST que é dado o pontapé inicial no mais novo site da KaizenWeb;</p>
]]></content:encoded>
			<wfw:commentRss>http://kaizenweb.com.br/wordpress/?feed=rss2&amp;p=1</wfw:commentRss>
		</item>
	</channel>
</rss>
