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

<channel>
	<title>KaizenWeb</title>
	<atom:link href="http://kaizenweb.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://kaizenweb.com.br</link>
	<description>Dicas de desenvolvimento web</description>
	<lastBuildDate>Thu, 15 Sep 2011 12:33:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Mudanças</title>
		<link>http://kaizenweb.com.br/2011/09/mudancas/</link>
		<comments>http://kaizenweb.com.br/2011/09/mudancas/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 12:33:37 +0000</pubDate>
		<dc:creator>Everton Emilio Tavares</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://kaizenweb.com.br/?p=94</guid>
		<description><![CDATA[Novidades! A partir do mês que vem, mais especificamente do dia 11, estou mudando de emprego, indo para uma empresa de Maringá, onde irei morar.]]></description>
			<content:encoded><![CDATA[<p>Novidades!</p>
<p>A partir do mês que vem, mais especificamente do dia 11, estou mudando de emprego, indo para uma empresa de Maringá, onde irei morar.</p>
]]></content:encoded>
			<wfw:commentRss>http://kaizenweb.com.br/2011/09/mudancas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>O M do MVC &#8211; Entidades</title>
		<link>http://kaizenweb.com.br/2011/08/o-m-do-mvc-entidades/</link>
		<comments>http://kaizenweb.com.br/2011/08/o-m-do-mvc-entidades/#comments</comments>
		<pubDate>Tue, 23 Aug 2011 14:43:17 +0000</pubDate>
		<dc:creator>Everton Emilio Tavares</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://kaizenweb.com.br/?p=72</guid>
		<description><![CDATA[O modelo de um sistema é composto por vários objetos, cada um com sua resposabilidade e comportamento, e vamos nessa série tentar abordar um por um, e o primeiro tipo de objeto que vamos ver são as entidades. Entidades são objetos de dominio que são identificados unicamente por uma identidade. Para exemplificar, vamos considerar um [...]]]></description>
			<content:encoded><![CDATA[<p>O modelo de um sistema é composto por vários objetos, cada um com sua resposabilidade e comportamento, e vamos nessa série tentar abordar um por um, e o primeiro tipo de objeto que vamos ver são as entidades.<br />
<span id="more-72"></span><br />
Entidades são objetos de dominio que são identificados unicamente por uma identidade. Para exemplificar, vamos considerar um sistema simples de cadastro de clientes.</p>
<p>Olhando este modelo é fácil de identificar que não pode existir clientes duplicados, e sendo assim, podemos considerar logo de cara que Cliente é uma entidade dentro do modelo. Para identificar cada um unicamente precisamos de uma identidade,  e para isso podemos utilizar o CPF ou CNPJ, que irá nos garantir que os clientes são diferentes independente se existe algum outro com o mesmo nome, pai, mãe, etc&#8230; (<a href="http://oglobo.globo.com/cidades/mat/2009/11/24/mae-batiza-14-filhas-com-mesmo-nome-em-pernambuco-914901062.asp">acha impossivel?</a> ), sendo assim, consideramos que dois clientes são o mesmo se e somente se a identidade dos dois forem iguais. Cada cliente pode ter um ou mais endereços. Se estes endereços forem utilizados apenas para correspondência ou coisas afins, não tem porque ter uma identidades, agora se ele for utilizado para gerar relatórios de vendas, ou coisas do gênero, é importante que tenha uma identidade bem definida.</p>
<p>Como implementar uma entidade?<br />
Para exemplificar, vamos utilizar a classe de cliente pessoa fisica, que possui as seguintes caracteristicas:<br />
- Possui o CPF como identidade, onde este campo é obrigatório; (ps. Antigamente (muito antigamente) casais podiam compartilhar o mesmo CPF, mas não vamos considerar isso neste exemplo)<br />
- Armazena o nome separado do sobrenome, onde os dois campos são obrigatórios;<br />
- Armazena a data do cadastro do cliente, tambem obrigatória;<br />
- Cada cliente possui um valor de bonus onde ele pode trocar por produtos, inicializando com zero.</p>
<p>Implementar isso é muito simples! Basta criar uma classe que armazena todos esses valores! Vamos lá:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> ClientePessoaFisica <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$cpf</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$sobrenome</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$dataCadastro</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</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;">private</span> <span style="color: #000088;">$valorBonus</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Trabalho facilitado com http://www.shuchow.com/gettersetter.html</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getCpf<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;">cpf</span><span style="color: #339933;">;</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> getNome<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;">nome</span><span style="color: #339933;">;</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> getSobrenome<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;">sobrenome</span><span style="color: #339933;">;</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> getDataCadastro<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;">dataCadastro</span><span style="color: #339933;">;</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> setCpf<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</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;">cpf</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$x</span><span style="color: #339933;">;</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> setNome<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</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;">nome</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$x</span><span style="color: #339933;">;</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> setSobrenome<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</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;">sobrenome</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$x</span><span style="color: #339933;">;</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> setDataCadastro<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</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;">dataCadastro</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$x</span><span style="color: #339933;">;</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> getValorBonus<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;">valorBonus</span><span style="color: #339933;">;</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> setValorBonus<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</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;">valorBonus</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$x</span><span style="color: #339933;">;</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>Ficou com muitas linhas né? E conforme esta entidade for crescendo o numero de campos, vai aumentar ainda mais as linhas! Como o PHP é mais inteligente que isso, vamos automatizar esse processo, utilizando um dos famosos métodos mágicos, chamado __call. O funcionamento dele é muito simples: Toda vez que for invocado um método da classe que não existe, o PHP redireciona para este método informando o nome do método e os parâmetros informados. Sendo assim, podemos criar setters e getters dinâmicos, economizando tempo suficiente para tomar uma xícara de café a mais durante o dia. Veja:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> ClientePessoaFisica <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$cpf</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$sobrenome</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$dataCadastro</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</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;">private</span> <span style="color: #000088;">$valorBonus</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Método simples, sem muita validação.
     * Se quiser um mais completo veja: http://cborrow.wordpress.com/2010/09/18/dynamic-getter-and-setters-in-php/
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __call<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$sMetodo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$aValor</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: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/set(.+)/A'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sMetodo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$aMatch</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// Se for um set...</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$aMatch</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$aValor</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/get(.+)/A'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sMetodo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$aMatch</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// Se for um get</span>
            <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$aMatch</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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>Muito simples, muito fácil, muito prático. Veja nossa super classe em funcionamento:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
    <span style="color: #000088;">$cliente</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ClientePessoaFisica<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;José&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setValorBonus</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">9000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Meu cliente favorito é o &quot;</span><span style="color: #339933;">+</span><span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; por isso ele tem &quot;</span><span style="color: #339933;">+</span><span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getValorBonus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; reais de bonus&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Opa, mas tem um problema nessa classe&#8230; no exemplo foi instanciado cliente sem CPF, e não pode existir cliente sem CPF pois este é a identidade do cliente. Também foi possível instanciar sem o sobrenome do cliente, e tudo isso torna esse cliente inválido perante ao modelo, pois está inconsistente com as regras que o definem. Para solucionar este problema, impedindo instanciar classes inconsistentes, basta criar um construtor! Veja como:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> ClientePessoaFisica <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$cpf</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$sobrenome</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$dataCadastro</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$valorBonus</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$cpf</span><span style="color: #339933;">,</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sobrenome</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;">cpf</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$cpf</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nome</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sobrenome</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$sobrenome</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dataCadastro</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">valorBonus</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Método simples, sem muita validação.
     * Se quiser um mais completo veja: http://cborrow.wordpress.com/2010/09/18/dynamic-getter-and-setters-in-php/
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __call<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$sMetodo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$aValor</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: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/set(.+)/A'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sMetodo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$aMatch</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// Se for um set...</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$aMatch</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$aValor</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/get(.+)/A'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sMetodo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$aMatch</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// Se for um get</span>
            <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$aMatch</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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>O Construtor impede que não seja possível cadastrar clientes sem as 3 informações obrigatórias. Ele também inicializa a classe, setando os valores iniciais para o bônus e para a data de cadastro. Veja agora como ficou a classe utilizando o construtor:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
    <span style="color: #000088;">$cliente</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ClientePessoaFisica<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;000.000.000-00&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;José&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Silva&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setValorBonus</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">9000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Meu cliente favorito é o &quot;</span><span style="color: #339933;">+</span><span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; por isso ele tem &quot;</span><span style="color: #339933;">+</span><span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getValorBonus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; reais de bonus&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Mas ainda não podemos dizer que nossa entidade está completa pois, se notarem o exemplo acima, estamos instanciando um cliente informando um CPF inválido. Para corrigir isso, basta validar o CPF informado no construtor, e para completar, adicionamos as validações para que não seja informado valores nulos para o nome e o sobrenome.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> ClientePessoaFisica <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$cpf</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$sobrenome</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$dataCadastro</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$valorBonus</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$cpf</span><span style="color: #339933;">,</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sobrenome</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        Validator<span style="color: #339933;">::</span><span style="color: #004000;">validaCpf</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cpf</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Somente CPF válido é permitido&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Validator<span style="color: #339933;">::</span><span style="color: #004000;">validaNotNull</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$nome</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Um nome deve ser informado&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Validator<span style="color: #339933;">::</span><span style="color: #004000;">validaNotNull</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sobrenome</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Um sobrenome deve ser informado&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">cpf</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$cpf</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nome</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sobrenome</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$sobrenome</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dataCadastro</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">valorBonus</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Método simples, sem muita validação.
     * Se quiser um mais completo veja: http://cborrow.wordpress.com/2010/09/18/dynamic-getter-and-setters-in-php/
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __call<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$sMetodo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$aValor</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: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/set(.+)/A'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sMetodo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$aMatch</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// Se for um set...</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$aMatch</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$aValor</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/get(.+)/A'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sMetodo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$aMatch</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// Se for um get</span>
            <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$aMatch</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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 se tentar passar um valor inválido para a entidade, será barrado pela validação e recebera uma linda e charmosa exception como consolo. Porém, se você perceber nossa classe ainda não está totalmente completa. Lembra que tentamos facilitar nossa vida utilizando o método mágico __call para ganhar uma xícara de café a mais? pois esse método abriu uma brecha na integridade da classe; Veja o exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
    <span style="color: #666666; font-style: italic;">// CPF gerado em http://www.geradorcpf.com/ . Se ele for o seu, me perdoe, não foi intencional</span>
    <span style="color: #000088;">$cliente</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ClientePessoaFisica<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;875.618.570-71&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;José&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Silva&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setCpf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;000.000.000-00&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Setando um CPF inválido sem gerar erro</span>
    <span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setValorBonus</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">9000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Meu cliente favorito é o &quot;</span><span style="color: #339933;">+</span><span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; por isso ele tem &quot;</span><span style="color: #339933;">+</span><span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getValorBonus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; reais de bonus&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Esse é o problema de se utilizar métodos mágicos, pois ele expõe todos os valores da entidade a alteração, e isso não é desejável para alguns casos, pois, depois de instanciado um cliente, não deve ser permitido alterar o seu CPF, o nome e o sobrenome podem ser alteráveis, mas teríamos que validar se o valor que está sendo informado está correto, e isso também não é possível de fazer facilmente com essa abordagem. Mesmo se implementássemos  uma configuração específica para cada campo, isso tornaria o código muito difícil de entender, e qualquer regra nova não contemplada pela configuração, ou algum calculo que possa ser executado quando setar um novo valor, teríamos um trabalhão para aplicar. Sendo assim, acredito que a melhor abordagem para a entidade é voltar ao nossos antigos e eficientes &#8220;setters&#8221; e &#8220;getters&#8221;, porém, com alterações para que a entidade se mantenha integra:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> ClientePessoaFisica <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$cpf</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$sobrenome</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$dataCadastro</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</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;">private</span> <span style="color: #000088;">$valorBonus</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$cpf</span><span style="color: #339933;">,</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sobrenome</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        Validator<span style="color: #339933;">::</span><span style="color: #004000;">validaCpf</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cpf</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Somente CPF válido é permitido&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">cpf</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$cpf</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setNome</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$nome</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Centraliza a validação de nome</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setSobrenome</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sobrenome</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Centraliza a validação de sobrenome</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dataCadastro</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">valorBonus</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// public function setCpf($x) { $this-&gt;cpf = $x; } Não pode alterar o CPF!</span>
    <span style="color: #666666; font-style: italic;">// public function setDataCadastro($x) { $this-&gt;dataCadastro = $x; } Não pode alterar a data de cadastro!!</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setNome<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nome</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
        Validator<span style="color: #339933;">::</span><span style="color: #004000;">validaNotNull</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$nome</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Um nome deve ser informado&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nome</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">;</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> setSobrenome<span style="color: #009900;">&#40;</span><span style="color: #000088;">$sobrenome</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
        Validator<span style="color: #339933;">::</span><span style="color: #004000;">validaNotNull</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sobrenome</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Um sobrenome deve ser informado&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sobrenome</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$sobrenome</span><span style="color: #339933;">;</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> setValorBonus<span style="color: #009900;">&#40;</span><span style="color: #000088;">$valor</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
        Validator<span style="color: #339933;">::</span><span style="color: #004000;">notNegative</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$valor</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Não é permitido bônus negativo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">valorBonus</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$valor</span><span style="color: #339933;">;</span> 
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Getters...</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getCpf<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;">cpf</span><span style="color: #339933;">;</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> getNome<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;">nome</span><span style="color: #339933;">;</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> getSobrenome<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;">sobrenome</span><span style="color: #339933;">;</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> getDataCadastro<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;">dataCadastro</span><span style="color: #339933;">;</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> getValorBonus<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;">valorBonus</span><span style="color: #339933;">;</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 sim podemos dizer que nossa classe está integra e ela possui garantias de que ninguem irá quebrar sua integridade. Dá um pouco mais de trabalho para codificar, mas agora temos um código limpo, fácil de entender e alterar, e você vai poder ficar tomando seu cafézinho em vez de ficar explicando pro estagiário novo como criar e modificar uma entidade nova que utiliza o método mágico &#8220;__call&#8221;; Ou corrigindo os problemas que o estagiário por esquecer no meio do sistema um código de teste que modificouo CPF do cliente mais importante da loja.<br />
Agora podemos vamos utilizar nossa classe:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
    <span style="color: #666666; font-style: italic;">// CPF gerado em http://www.geradorcpf.com/ . Se ele for o seu, me perdoe, não foi intencional</span>
    <span style="color: #000088;">$cliente</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ClientePessoaFisica<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;875.618.570-71&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;José&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Silva&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//$cliente-&gt;setCpf(&quot;000.000.000-00&quot;); // Isso não é mais possível</span>
    <span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setValorBonus</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">9000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Meu cliente favorito é o &quot;</span><span style="color: #339933;">+</span><span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getNome</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; por isso ele tem &quot;</span><span style="color: #339933;">+</span><span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getValorBonus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; reais de bonus&quot;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Utilizando uma bonificação de 200 reais</span>
    <span style="color: #000088;">$novoBonus</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getValorBonus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">200</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$cliente</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setValorBonus</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$novoBonus</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Vou finalizar por aqui este artigo, mas ja adiantando que ainda temos muito a melhorar nessa nossa entidade. No proximo item da série vou falar de coesão e acoplamento nas entidades.</p>
<p>Até la</p>
]]></content:encoded>
			<wfw:commentRss>http://kaizenweb.com.br/2011/08/o-m-do-mvc-entidades/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O M do MVC (Introdução)</title>
		<link>http://kaizenweb.com.br/2011/08/o-m-do-mvc-introducao/</link>
		<comments>http://kaizenweb.com.br/2011/08/o-m-do-mvc-introducao/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 12:42:29 +0000</pubDate>
		<dc:creator>Everton Emilio Tavares</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://kaizenweb.com.br/?p=57</guid>
		<description><![CDATA[A partir de hoje vou iniciar uma nova série falando apenas da camada de Modelo, que foi muito pedida pra mim, e vejo que é uma grande icógnita. Acredito que o MVC (Model, View, Controller) é o conceito de desenvolvimento mais conhecido, difundido, defendido e utilizado por programadores de todas as linguagens de programação. Modelo [...]]]></description>
			<content:encoded><![CDATA[<p>A partir de hoje vou iniciar uma nova série falando apenas da camada de Modelo, que foi muito pedida pra mim, e vejo que é uma grande icógnita. Acredito que o MVC (Model, View, Controller) é o conceito de desenvolvimento mais conhecido, difundido, defendido e utilizado por programadores de todas as linguagens de programação.</p>
<p>Modelo é um conceito muito utilizado em programação, porém, muitas vezes, com diversos significados diferentes. Eu considero modelo como sendo a abstração de um domínio. Eu explico: Domínio é a área (ou ramo) de conhecimento de um sistema, como por exemplo, área financeira, escolar, industrial, e Modelo é o sub-conjunto de informações e operações do domínio que será utilizada na aplicação, e isso depende muito do tipo de aplicação que se deseja implementar.</p>
<p>Por exemplo, um sistema de controle de alunos, pertence ao domínio escolar, e o modelo é composto pelas caracteristicas de cada aluno (nome, telefone, endereço), pais, turmas, matérias, professores, entre outros. Agora imagine um sistema que apenas utiliza métodos de inteligência artificial para realizar a distribuição de horários entre os professores. Ele também pertence ao domínio escolar, porém o modelo dele é composto apenas pelas matérias, turmas e seus respectivos professores, pois não é necessário o nome de cada aluno para essa aplicação. Ou seja, o domínio é o mesmo, porém o modelo é mais reduzido.</p>
<p>Outra particularidade que se deve observar é que, por mais que os dois sistemas contenham informações sobre professores, matérias e turmas, os casos de uso que cada sistema realiza encima dessas informações também são diferentes, por isso é correto afirmar que o modelo abrange, além da abstração de dados do domínio que a aplicação irá manipular, também as operações (casos de uso) que a aplicação é capaz de fazer. Sendo assim, a camada Model do MVC deve ser responsável por todos os dados e comportamentos que pertencem ao modelo da aplicação.</p>
<p>Acontece que em muitos tutoriais que existem circulando pela internet, eu vejo que a camada de Modelo é representada como sendo apenas uma forma de abstrair o banco de dados para recuperar as informações, e isso acontece inclusive em sites de referência, como por exemplo a <a href="http://codeigniter.com/user_guide/general/models.html">documentação do CodeIgniter</a>. Veja:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Blogmodel <span style="color: #000000; font-weight: bold;">extends</span> CI_Model <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$title</span>   <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$date</span>    <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
&nbsp;
    <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;">// Call the Model constructor</span>
        parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> get_last_ten_entries<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'entries'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$query</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">result</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> insert_entry<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;">title</span>   <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// please read the below note</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">content</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'content'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">date</span>    <span style="color: #339933;">=</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">insert</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'entries'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> update_entry<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;">title</span>   <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">content</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'content'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">date</span>    <span style="color: #339933;">=</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">update</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'entries'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Essa abordagem, apesar de facilitar  o desenvolvimento, nos força a colocar as regras de negócio, dentro do controller, misturando assim as camadas M (Model) e C (Controller). Na próxima parte vou abordar a construção e organização de entidades, evitando assim essa mistura indesejada;</p>
<p>Vocês concordam? não concordam? Coloquem suas opiniões nos comentários!!</p>
<p>Ps. Eu não sou contra o CodeIgniter, pelo contrário, gosto muito do Framework, porém é necessário alguns &#8220;hacks&#8221;, que eu vou mostrar no próximo post.</p>
]]></content:encoded>
			<wfw:commentRss>http://kaizenweb.com.br/2011/08/o-m-do-mvc-introducao/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Criando um FrameWork PHP do Zero Usando Padrões de Projeto (Parte 4)</title>
		<link>http://kaizenweb.com.br/2010/12/criando-um-framework-php-do-zero-usando-padroes-de-projeto-parte-4/</link>
		<comments>http://kaizenweb.com.br/2010/12/criando-um-framework-php-do-zero-usando-padroes-de-projeto-parte-4/#comments</comments>
		<pubDate>Mon, 27 Dec 2010 17:32:14 +0000</pubDate>
		<dc:creator>Everton Emilio Tavares</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://kaizenweb.com.br/?p=26</guid>
		<description><![CDATA[Olá Hoje veremos o padrão Composite, que é um padrão que tem um nome meio que &#8220;auto-explicativo&#8221;; Composite é um padrão que define objetos que é formado pela composição de outros objetos, permitindo assim tratar vários objetos como se fosse um só. Para exemplificar o funcionamento do padrão composite, vamos utilizar a classe guerreiro utilizada [...]]]></description>
			<content:encoded><![CDATA[<p>Olá</p>
<p>Hoje veremos o padrão Composite, que é um padrão que tem um nome meio que &#8220;auto-explicativo&#8221;; Composite é um padrão que define objetos que é formado pela composição de outros objetos, permitindo assim tratar vários objetos como se fosse um só.<br />
<span id="more-26"></span><br />
Para exemplificar o funcionamento do padrão composite, vamos utilizar a classe guerreiro utilizada na parte 3 do artigo; Caso você perdeu, <a href="http://kaizenweb.com.br/2010/12/contruindo-um-framework-php-do-zero-parte-3/">leia aqui</a>; Veja novamente a nossa implementação de Guerreiro:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><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: #339933;">;</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: #339933;">;</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: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Para iniciar uma &#8220;Guerra&#8221;, basta criar alguns guerreiros, e mandar eles lutar! Portanto:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$guerreiro1</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: #339933;">;</span>
<span style="color: #000088;">$guerreiro2</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: #339933;">;</span>
<span style="color: #000088;">$guerreiro3</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> Machado<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$guerreiro1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lutar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$guerreiro2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lutar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$guerreiro3</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lutar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Veja que o trabalho de manutenção nesse código é relativamente grande, pois quando for necessário adicionar mais guerreiros, será preciso sempre adicionar mais duas linhas de código: Uma para instanciar um novo objeto, e outra para mandar o guerreiro lutar, e é nesse cenário que o padrão Composite vem nos ajudar. </p>
<p>O padrão composite permite a manipulação de vários objetos como se fossem um objeto só, facilitando assim a nossa &#8220;guerra&#8221;, ou seja, podemos criar um &#8220;exército de guerreiros&#8221; e mandar todo mundo lutar com apenas um comando. Sendo assim, primeiramente temos que extrair uma interface que represente os nossos guerreiros, para que seja possivel alternar entre o uso da nossa classe Guerreiro definida acima, e o uso do nosso composite que compõe vários guerreiros. A nivel de exemplo, vamos manter apenas o método &#8220;lutar&#8221;, e a interface vai ficar da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">interface</span> IGuerreiro <span style="color: #009900;">&#123;</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: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Para quem não sabe, uma interface é como se fosse um contrato, onde as classes que a implementam devem ter os métodos e parâmetros definidos por ela. Neste caso, as classes que implementam IGuerreiro devem implementar apenas o método lutar.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #666666; font-style: italic;">//Implementação anterior de Guerreiro, agora implementando IGuerreiro</span>
<span style="color: #000000; font-weight: bold;">class</span> Guerreiro implements IGuerreiro <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$arma</span><span style="color: #339933;">;</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: #339933;">;</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> 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: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Implementação do composite de Guerreiro</span>
<span style="color: #000000; font-weight: bold;">class</span> GuerreiroComposite implements IGuerreiro <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$guerreiros</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Método que adiciona os guerreiros no composite</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> add<span style="color: #009900;">&#40;</span>IGuerreiro <span style="color: #000088;">$guerreiro</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;">guerreiros</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$guerreiro</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// O método lutar deve fazer todos os guerreiros lutarem</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: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$guerreiro</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">guerreiros</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$guerreiro</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lutar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Agora para enviar um exercito de guerreiros para a batalha, basta criar alguns guerreiros, e adicioná-los no composite através do método <strong>add</strong>, e pronto! Notem que o método add contem o tipo permitido para o parâmetro, para impedir que qualquer outra classe seja adicionada no Composite, mesmo essa outra classe contendo os mesmos métodos da interface. No exemplo a seguir, temos um exercito de arqueiros partindo pra luta:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$exercitoDeArqueiros</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> GuerreiroComposite<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$exercitoDeArqueiros</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</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: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$exercitoDeArqueiros</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</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: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$exercitoDeArqueiros</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</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: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$exercitoDeArqueiros</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</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: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$exercitoDeArqueiros</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</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: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$exercitoDeArqueiros</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lutar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Como tanto Guerreiro quanto GuerreiroComposite implementam a interface IGuerreiro, podemos fazer um Composite conter outro composite, como no exemplo a seguir:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$exercitoDeArqueiros</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> GuerreiroComposite<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$exercitoDeArqueiros</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</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: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// .. Demais arqueiros</span>
&nbsp;
<span style="color: #000088;">$exercitoDaMachadinha</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> GuerreiroComposite<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$exercitoDaMachadinha</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</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> Machado<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// .. Demais guerreiros de machado</span>
&nbsp;
<span style="color: #000088;">$exercitoNervoso</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> GuerreiroComposite<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$exercitoNervoso</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</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: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Tem um diferentão que resolveu lutar de espada</span>
<span style="color: #000088;">$exercitoNervoso</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$exercitoDaMachadinha</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$exercitoNervoso</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$exercitoDeArqueiros</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$exercitoNervoso</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lutar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Agora que ja foi explicado o funcionamento do padrão, vamos passá-lo para o nosso Framework. </p>
<p>Toda boa aplicação Web possui alguns elementos que são fundamentais para que ela funcione. Hoje em dia, por exemplo, não encontramos muitas aplicações que não trabalham com banco de dados, ou que não armazenem informações de acesso, e com as aplicações que possivelmente serão desenvolvidas com o nosso framework não é diferente, e sendo assim, vamos supor que nosso sistema irá trabalhar com o banco Mysql, e para isso vamos adicionar uma conexão simples de banco de dados mysql ao nosso projeto:</p>
<p>arquivo: index.php</p>

<div class="wp_syntax"><div class="code"><pre class="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: #339933;">;</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: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Vamos adicionar aqui para não precisar adicionar dentro dos commands</span>
    <span style="color: #000088;">$dbname</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;teste&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Indique o nome do banco de dados que será aberto</span>
    <span style="color: #000088;">$usuario</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;admin&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Indique o nome do usuário que tem acesso</span>
    <span style="color: #000088;">$password</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SenhaDoAdmin&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Indique a senha do usuário</span>
    <span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$usuario</span><span style="color: #339933;">,</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">dir</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dbname</span><span style="color: #339933;">,</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <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: #339933;">;</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: #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;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #990000;">mysql_close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 404 - Página não encontrada&lt;/h1&gt;'</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 500 - Erro na execução&lt;/h1&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<blockquote><p>Observação: Não está em discussão nesse artigo qual a melhor forma ou ferramente de conexão com banco, a idéia aqui é exemplificar a localização desse tipo de mecanismo <img src='http://kaizenweb.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />
</p></blockquote>
<p>Apesar de estar no ponto correto da execução, ou seja, conectando antes da execução do command e fechando após, o local da conexão não está apropriado, pois estamos misturando configuração/codigo de banco de dados com a execução do nosso framework, que é o papel do index, e tambem temos o problema de necessitar alterar o index a cada cliente que desejarmos configurar.<br />
Alguns de vocês devem estar pensando: &#8220;Porque não cria um arquivo separado com a conexão e faz um include?&#8221;. Essa realmente é uma prática utilizada por vários programadores PHP, e que com certeza resolve nosso problema, porem devemos remover o mysql_close do final do arquivo, se não iremos condicionar o sistema a utilizar somente mysql (o que não é desejável); Vejamos como ficou: </p>
<p>arquivo: index.php</p>

<div class="wp_syntax"><div class="code"><pre class="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: #339933;">;</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: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Incluimos o arquivo de conexão com todo o código da conexão</span>
    <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;conexao.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <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: #339933;">;</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: #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;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// mysql_close(); Removido!!</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 404 - Página não encontrada&lt;/h1&gt;'</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 500 - Erro na execução&lt;/h1&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Com certeza funciona, mas podemos utilizar uma solução mais orientada a objetos, não podemos? Então vamos criar uma classe para essa conexão. Ela conterá dois métodos: <em>init </em>e <em>finish</em>, que serão executados antes e depois da execução respectivamente;</p>
<p>Conexao.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Conexao <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> start<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$dbname</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;teste&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Indique o nome do banco de dados que será aberto</span>
        <span style="color: #000088;">$usuario</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;admin&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Indique o nome do usuário que tem acesso</span>
        <span style="color: #000088;">$password</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SenhaDoAdmin&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Indique a senha do usuário</span>
        <span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$usuario</span><span style="color: #339933;">,</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">dir</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dbname</span><span style="color: #339933;">,</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> finish<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">mysql_close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Agora da pra colocar novamente</span>
    <span style="color: #009900;">&#125;</span>   
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Adicionando a utilização da classe e removendo a inclusão do arquivo no index:</p>
<p>arquivo: index.php</p>

<div class="wp_syntax"><div class="code"><pre class="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: #339933;">;</span>
    <span style="color: #000088;">$conn</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Conexao<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Sera carregado via __autoload</span>
&nbsp;
    <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: #339933;">;</span>
    <span style="color: #000088;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <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: #339933;">;</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: #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;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">finish</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 404 - Página não encontrada&lt;/h1&gt;'</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 500 - Erro na execução&lt;/h1&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Agora sim, temos uma solução totalmente orientada a objetos (totalmente não, pois a conexão com o mysql não é OO), e podemos utilizar o Mysql em nossa aplicação, mas ainda não temos uma solução ideal, pois o mecanismo está preso a classe Conexao, e caso existir a necessidade de alternar entre tipos diferentes de conexão ou simplesmente alterar a configuração, por exemplo, ficamos presos a edição do arquivo conexao.php;<br />
Vamos então alterar nosso código para utilizar o padrão <strong>Strategy</strong>, que foi visto na parte 3, que irá permitir a gente trocar a classe de implementação da conexão, permitindo ainda a reutilização das classes. Primeiramente é necessário criar uma interface, que irá nos possibilitar a troca da implementação, e vamos fazer com que a nossa classe de configuração retorne a implementação desejada. Eis as alterações:</p>
<p>arquivo: Conexao.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Interface para a conexão</span>
<span style="color: #000000; font-weight: bold;">interface</span> Conexao <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Método que será executado na inicialização da requisição</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> start<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Método que será executado na finalização da requisição</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> finish<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E agora transferimos a conexão do mysql para uma classe separada, que implementa a conexão:</p>
<p>arquivo: Conexao/Mysql.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Conexao_Mysql implements Conexao <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> start<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$dbname</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;teste&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Indique o nome do banco de dados que será aberto</span>
        <span style="color: #000088;">$usuario</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;admin&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Indique o nome do usuário que tem acesso</span>
        <span style="color: #000088;">$password</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SenhaDoAdmin&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Indique a senha do usuário</span>
        <span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$usuario</span><span style="color: #339933;">,</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">dir</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dbname</span><span style="color: #339933;">,</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> finish<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">mysql_close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Agora da pra colocar novamente</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Adicionamos mais um método no Config.php para retornar a conexão desejada.</p>
<p>arquivo: Config.php</p>

<div class="wp_syntax"><div class="code"><pre class="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: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$conexao</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> 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 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: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Configura nossa conexão</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">conexao</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Conexao_Mysql<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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: #339933;">;</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> getConexao<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;">conexao</span><span style="color: #339933;">;</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>Alterando o index para funcionar com a configuração;</p>
<p>arquivo: index.php</p>

<div class="wp_syntax"><div class="code"><pre class="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: #339933;">;</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: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Devemos configurar antes de chamar a conexão</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Recupera a conexão e inicializa ela</span>
    <span style="color: #000088;">$conn</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getConexao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <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: #339933;">;</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: #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;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// Finaliza a conexão</span>
    <span style="color: #000088;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">finish</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 404 - Página não encontrada&lt;/h1&gt;'</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 500 - Erro na execução&lt;/h1&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Agora temos nosso método de conexão totalmente personalizável! Quando desejarmos personalizar nossa conexão, basta editar somente o arquivo de configuração, e pronto!<br />
Vamos analisar mais profundamente nosso framework. Com certeza o mecanismo de conexão com o banco de dados é fundamental para qualquer aplicação, mas existem outros serviços que podem ser necessário inicializar em toda e qualquer requisição, similar a conexão (como log ou controle de acesso). O framework precisa possibilitar, de maneira fácil, a adição desses mecanismos. Para isto, basta alterar nossa interface de conexão para um nome mais genérico, afim de que ela possa tambem ser utilizada para outros fins. Vamos chama-lá de <strong>RequestAction</strong>, pois é uma classe de ações que serão realizadas em todas as conexões;</p>
<p>arquivo: RequestAction.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Interface para todo e qualquer mecanismo que deve ser executado nas requisições</span>
<span style="color: #666666; font-style: italic;">// É a mesma estrutura da Conexao.php</span>
<span style="color: #000000; font-weight: bold;">interface</span> RequestAction <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Método que será executado na inicialização da requisição</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> start<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Método que será executado na finalização da requisição</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> finish<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E agora alteramos a conexão do mysql para implementar a interface RequestAction, em vez de Conexao. Tambem trocamos ela de diretório para ter uma melhor semântica no nome;</p>
<p>arquivo: RequestAction/MysqlConnection.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> RequestAction_MysqlConnection implements RequestAction <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> start<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$dbname</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;teste&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Indique o nome do banco de dados que será aberto</span>
        <span style="color: #000088;">$usuario</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;admin&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Indique o nome do usuário que tem acesso</span>
        <span style="color: #000088;">$password</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SenhaDoAdmin&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Indique a senha do usuário</span>
        <span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$usuario</span><span style="color: #339933;">,</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">dir</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dbname</span><span style="color: #339933;">,</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> finish<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">mysql_close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Agora da pra colocar novamente</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

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

<div class="wp_syntax"><div class="code"><pre class="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: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$requestAction</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> 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 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: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Configura nossa conexão</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">requestAction</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RequestAction_MysqlConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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: #339933;">;</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> getRequestAction<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;">requestAction</span><span style="color: #339933;">;</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>Alterando o index para funcionar com a configuração;</p>
<p>arquivo: index.php</p>

<div class="wp_syntax"><div class="code"><pre class="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: #339933;">;</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: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Recupera a RequestAction e a inicializa</span>
    <span style="color: #000088;">$reqAction</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getRequestAction</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$reqAction</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <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: #339933;">;</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: #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;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// Finaliza a RequestAction</span>
    <span style="color: #000088;">$reqAction</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">finish</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 404 - Página não encontrada&lt;/h1&gt;'</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 500 - Erro na execução&lt;/h1&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Agora temos um mecanismo totalmente genérico que funciona para qualquer coisa, e não somente para conexão com o banco de dados! Caso quisermos fazer um log, é só trocar na configuração o RequestAction_MysqlConnection por uma RequestAction_Log, de forma simples e fácil sem precisarmos mecher com no código do nosso index.php.</p>
<p>Mas, e se quisermos o log e a conexão com o banco? Poderiamos criar uma classe chamada RequestAction_LogAndMysqlConnection, mas não é interessante pois, caso houver vários clientes ou aplicações, o seu sistema de log muito provavelmente será igual para todos. É nesse ponto que entra o nosso amigo <strong>Composite</strong>! Vamos criar uma classe que compõe vários composites, chamada RequestAction_Composite, que irá possibilitar o reaproveitamento deles. Vamos ao código:</p>
<p>arquivo: RequestAction/Composite.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">RequestAction_Composite implements RequestAction <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$requestActions</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> add<span style="color: #009900;">&#40;</span>RequestAction <span style="color: #000088;">$reqAct</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;">requestActions</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$reqAct</span><span style="color: #339933;">;</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> start<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">requestActions</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$reqAct</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$reqAct</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> finish<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">requestActions</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$reqAct</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$reqAct</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">finish</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Agora no nosso config, vamos utiliza-lo para poder utilizar vários RequestActions:</p>
<p>arquivo: Config.php</p>

<div class="wp_syntax"><div class="code"><pre class="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: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$requestAction</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> 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 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: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Configura os RequestActions</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">requestAction</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> RequestAction_Composite<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">requestAction</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>RequestAction_MysqlConnection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">requestAction</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>RequestAction_Log<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">requestAction</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>RequestAction_ControleAcesso<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Quantos forem necessários...</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: #339933;">;</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> getRequestAction<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;">requestAction</span><span style="color: #339933;">;</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 sim podemos dar como concluída nosso mecanismo de inicialização de recursos, que nos possibilita trocar a implementação com a utilização do padrão <strong>Strategy</strong>, e também possibilita a utilização de vários mecanismos diferentes em conjunto, e a reutilização deles, com a ajuda do padrão <strong>Composite</strong>. As configurações continuam sendo feitas em um único local (config.php), mantendo o resto do código do sistema sem a necessidade de alteração.</p>
]]></content:encoded>
			<wfw:commentRss>http://kaizenweb.com.br/2010/12/criando-um-framework-php-do-zero-usando-padroes-de-projeto-parte-4/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Voltando a programação normal</title>
		<link>http://kaizenweb.com.br/2010/12/voltando-a-programacao-normal/</link>
		<comments>http://kaizenweb.com.br/2010/12/voltando-a-programacao-normal/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 11:37:55 +0000</pubDate>
		<dc:creator>Everton Emilio Tavares</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://kaizenweb.com.br/?p=22</guid>
		<description><![CDATA[Depois de muito tempo, resolvi ressuscitar o blog. Aconteceu muita coisa durante esse tempo, como meu casamento e o nascimento do meu filho, e para me dedicar melhor a essa fase importante da minha vida, escolhi em deixar o blog de lado, mas agora estou voltando a ativa tendo em mente um monte de novos [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de muito tempo, resolvi ressuscitar o blog. </p>
<p>Aconteceu muita coisa durante esse tempo, como meu casamento e o nascimento do meu filho, e para me dedicar melhor a essa fase importante da minha vida, escolhi em deixar o blog de lado, mas agora estou voltando a ativa tendo em mente um monte de novos assuntos para abordar sobre desenvolvimento e arquitetura de software em PHP, e porque não, em outras linguagens.</p>
<p>Para começar ja coloco novamente os posts antigos sobre o desenvolvimento de um FrameWork PHP, e logo estarei postando a quarta parte da série. Também estou preparando um artigo sobre testes, que é algo muito esquecido e algumas vezes mal visto pelos programadores, mas que é uma grande ferramenta para os programadores.</p>
<p>Então, até logo.</p>
]]></content:encoded>
			<wfw:commentRss>http://kaizenweb.com.br/2010/12/voltando-a-programacao-normal/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Criando um FrameWork PHP do Zero Usando Padrões de Projeto (Parte 3)</title>
		<link>http://kaizenweb.com.br/2010/12/contruindo-um-framework-php-do-zero-parte-3/</link>
		<comments>http://kaizenweb.com.br/2010/12/contruindo-um-framework-php-do-zero-parte-3/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 01:31:29 +0000</pubDate>
		<dc:creator>Everton Emilio Tavares</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://kaizenweb.com.br/?p=4</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 [...]]]></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;<br />
<span id="more-4"></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" 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: #b1b100;">echo</span> <span style="color: #0000ff;">'lutando com os punhos'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">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: #b1b100;">echo</span> <span style="color: #0000ff;">'Atirando com o Arco'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">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: #b1b100;">echo</span> <span style="color: #0000ff;">'Lutando com espada'</span><span style="color: #339933;">;</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" 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: #339933;">;</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: #339933;">;</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: #339933;">;</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: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'Atirando com o arco'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">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: #b1b100;">echo</span> <span style="color: #0000ff;">'Cabra macho luta com os punhos'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">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: #b1b100;">echo</span> <span style="color: #0000ff;">'Lutando com a Espada'</span><span style="color: #339933;">;</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: #339933;">;</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: #339933;">;</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><span style="color: #339933;">;</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" 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: #339933;">;</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: #339933;">;</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: #339933;">;</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><span style="color: #339933;">;</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" 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: #339933;">;</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: #339933;">;</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" 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="color: #0000ff;">'module'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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="color: #0000ff;">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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" 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: #009900; 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="color: #0000ff;">'index'</span><span style="color: #339933;">;</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: #009900; 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="color: #0000ff;">'index'</span><span style="color: #339933;">;</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: #339933;">;</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><span style="color: #339933;">;</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="color: #0000ff;">'command/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$module</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.php'</span><span style="color: #339933;">;</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>
               <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> Exception_Pagenotfound<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'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: #339933;">;</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><span style="color: #339933;">;</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="color: #0000ff;">'Command'</span><span style="color: #339933;">;</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: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> Exception_Pagenotfound<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'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: #339933;">;</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: #339933;">;</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/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" 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: #339933;">;</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: #339933;">;</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: #339933;">;</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" 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: #339933;">;</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: #339933;">;</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: #339933;">;</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: #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;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 404 - Página não encontrada&lt;/h1&gt;'</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 500 - Erro na execução&lt;/h1&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></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" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; 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><span style="color: #339933;">;</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: #b1b100;">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="color: #0000ff;">'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="color: #0000ff;">'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: #339933;">;</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: #339933;">;</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: #339933;">;</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: #339933;">;</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="color: #0000ff;">'/'</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: #339933;">;</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: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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: #339933;">;</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" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; 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: #339933;">;</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: #339933;">;</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: #339933;">;</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/wp-content/uploads/2010/12/parte3.zip'>Códigos desse Artigo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kaizenweb.com.br/2010/12/contruindo-um-framework-php-do-zero-parte-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Criando um FrameWork PHP do Zero Usando Padrões de Projeto (Parte 2)</title>
		<link>http://kaizenweb.com.br/2010/12/criando-um-framework-php-do-zero-usando-padroes-de-projeto-parte-2/</link>
		<comments>http://kaizenweb.com.br/2010/12/criando-um-framework-php-do-zero-usando-padroes-de-projeto-parte-2/#comments</comments>
		<pubDate>Thu, 23 Dec 2010 11:27:47 +0000</pubDate>
		<dc:creator>Everton Emilio Tavares</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://kaizenweb.com.br/?p=13</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 [...]]]></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/?p=16">clicando aqui</a>;<br />
<span id="more-13"></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" 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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;Erro na execução do sistema&lt;/h1&gt;'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Descrição do erro: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$mensagem</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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" 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="color: #0000ff;">'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="color: #0000ff;">'module'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">;</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="color: #0000ff;">'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="color: #0000ff;">'action'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">;</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: #339933;">;</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><span style="color: #339933;">;</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="color: #0000ff;">'command/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$module</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.php'</span><span style="color: #339933;">;</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: #339933;">;</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="color: #0000ff;">'Command'</span><span style="color: #339933;">;</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: #339933;">;</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="color: #0000ff;">'Command não encontrado!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #009900;">&#125;</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<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" 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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;Erro na execução do sistema&lt;/h1&gt;'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Descrição do erro: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$mensagem</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Local do erro: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$arquivo</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' na linha '</span><span style="color: #339933;">.</span><span style="color: #000088;">$linha</span><span style="color: #339933;">.</span><span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #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><span style="color: #339933;">;</span></pre></div></div>

<p>Os parametros recebidos pela função são:</p>
<ul>
<li>$n_erro &#8211; Tipo do Erro (E_USER_ERROR,E_USER_WARNING, E_USER_NOTICE)</li>
<li>$mensagem &#8211; Mensagem do Erro</li>
<li>$arquivo &#8211; Arquivo onde ocorreu o erro</li>
<li>$linha &#8211; Linha onde ocorreu o erro</li>
<li>$contexto &#8211; 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" 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="color: #0000ff;">'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="color: #0000ff;">'module'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">;</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="color: #0000ff;">'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="color: #0000ff;">'action'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">;</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: #339933;">;</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><span style="color: #339933;">;</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="color: #0000ff;">'command/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$module</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.php'</span><span style="color: #339933;">;</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: #339933;">;</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="color: #0000ff;">'Command'</span><span style="color: #339933;">;</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: #339933;">;</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="color: #0000ff;">'Command não encontrado'</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">E_USER_ERROR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #009900;">&#125;</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<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" 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: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">trigger_error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Não é possivel dividir por zero'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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: #339933;">;</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" 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="color: #0000ff;">'n1'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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="color: #0000ff;">'n2'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Resultado: '</span><span style="color: #339933;">,</span><span style="color: #000088;">$valor</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Obrigado por visitar nosso site!'</span><span style="color: #339933;">;</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" 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: #cc66cc;">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: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//Lançando a exceção, (throw = lançar)</span>
        <span style="color: #b1b100;">throw</span> <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: #339933;">;</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: #339933;">;</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="color: #0000ff;">'n1'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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="color: #0000ff;">'n2'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Resultado: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$valor</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'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="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'Obrigado por visitar nosso site!'</span><span style="color: #339933;">;</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" 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: #339933;">;</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: #339933;">;</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: #339933;">;</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: #339933;">;</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: #339933;">;</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: #339933;">;</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: #cc66cc;">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: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//Lançando a exceção </span>
        <span style="color: #b1b100;">throw</span> <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: #339933;">;</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: #339933;">;</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="color: #0000ff;">'n1'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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="color: #0000ff;">'n2'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Resultado: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$valor</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'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="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//Utilizando as funções personalizadas</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'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="color: #0000ff;">' 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="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'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="color: #0000ff;">'&lt;br /&gt;'</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'Obrigado por visitar nosso site!'</span><span style="color: #339933;">;</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" 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: #cc66cc;">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: #339933;">;</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" 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="color: #0000ff;">'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="color: #0000ff;">'module'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">;</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="color: #0000ff;">'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="color: #0000ff;">'action'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">;</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: #339933;">;</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><span style="color: #339933;">;</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="color: #0000ff;">'command/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$module</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.php'</span><span style="color: #339933;">;</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>
               <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> Exception_Pagenotfound<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'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: #339933;">;</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><span style="color: #339933;">;</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="color: #0000ff;">'Command'</span><span style="color: #339933;">;</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: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> Exception_Pagenotfound<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'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: #339933;">;</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: #339933;">;</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" 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="color: #0000ff;">'lib/'</span><span style="color: #339933;">.</span><span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">,</span><span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'_'</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="color: #0000ff;">'.php'</span><span style="color: #339933;">;</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: #339933;">;</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: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 404 - Página não encontrada&lt;/h1&gt;'</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h1&gt;ERRO 500 - Erro na execução&lt;/h1&gt;'</span><span style="color: #339933;">;</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" 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="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'usuario'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'senha'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
              <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Não foi possivel conectar com o banco de dados'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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="color: #0000ff;">'banco'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Não foi possivel selecionar o banco de dados'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
          <span style="color: #666666; font-style: italic;">//Verifica se o id passado é um numero inteiro</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_int</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>
              <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'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: #339933;">;</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="color: #0000ff;">'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: #339933;">;</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: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
              <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> Exception_Pagenotfound<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Noticia com id '</span><span style="color: #339933;">.</span><span style="color: #000088;">$id_da_noticia</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' não existe'</span><span style="color: #339933;">;</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/wp-content/uploads/2010/12/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/2010/12/criando-um-framework-php-do-zero-usando-padroes-de-projeto-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando um FrameWork PHP do Zero Usando Padrões de Projeto (Parte 1)</title>
		<link>http://kaizenweb.com.br/2010/12/criando-um-framework-php-do-zero-usando-padroes-de-projeto-parte-1/</link>
		<comments>http://kaizenweb.com.br/2010/12/criando-um-framework-php-do-zero-usando-padroes-de-projeto-parte-1/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 11:29:02 +0000</pubDate>
		<dc:creator>Everton Emilio Tavares</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://kaizenweb.com.br/?p=16</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;<br />
<span id="more-16"></span></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 />
<!--more--><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" 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="color: #0000ff;">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</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="color: #0000ff;">'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="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
     <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Lendo a noticia de id '</span><span style="color: #339933;">.</span><span style="color: #000088;">$id_da_noticia</span><span style="color: #339933;">;</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="color: #0000ff;">'formulario'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Formulário de Cadastro de Noticia'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Home das Noticias'</span><span style="color: #339933;">;</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" 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: #b1b100;">echo</span> <span style="color: #0000ff;">'Home das Noticias'</span><span style="color: #339933;">;</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="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
     <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Lendo a noticia de id '</span><span style="color: #339933;">.</span><span style="color: #000088;">$id_da_noticia</span><span style="color: #339933;">;</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: #b1b100;">echo</span> <span style="color: #0000ff;">'Formulário de Cadastro de Noticia'</span><span style="color: #339933;">;</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="color: #0000ff;">'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="color: #0000ff;">'formulario'</span><span style="color: #339933;">:</span> formulario<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>break<span style="color: #339933;">;</span>
     <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'ler'</span><span style="color: #339933;">:</span> ler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
     <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span> home<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">break</span><span style="color: #339933;">;</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" 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="color: #0000ff;">'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="color: #0000ff;">'formulario'</span><span style="color: #339933;">:</span>
          <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'formulario.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          formulario<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
     <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'ler'</span><span style="color: #339933;">:</span>
          <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ler.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          ler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
     <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
          <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'home.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          home<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #b1b100;">break</span><span style="color: #339933;">;</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" 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: #339933;">;</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" 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="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
          <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Lendo a noticia de id '</span><span style="color: #339933;">.</span><span style="color: #000088;">$id_da_noticia</span><span style="color: #339933;">;</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" 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="color: #0000ff;">'command.php'</span><span style="color: #339933;">;</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: #cc66cc;">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="color: #0000ff;">'.php'</span><span style="color: #339933;">;</span>
     <span style="color: #b1b100;">require_once</span> <span style="color: #000088;">$nomeArquivo</span><span style="color: #339933;">;</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="color: #0000ff;">'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="color: #0000ff;">'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><span style="color: #339933;">;</span>break<span style="color: #339933;">;</span>
     <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'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><span style="color: #339933;">;</span>break<span style="color: #339933;">;</span>
     <span style="color: #b1b100;">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><span style="color: #339933;">;</span>break<span style="color: #339933;">;</span>
<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><span style="color: #339933;">;</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 (&#8216;_&#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" 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="color: #0000ff;">'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="color: #0000ff;">'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: #339933;">;</span>
               <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'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: #339933;">;</span>
               <span style="color: #b1b100;">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: #339933;">;</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" 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="color: #0000ff;">'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="color: #0000ff;">'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: #cc66cc;">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="color: #0000ff;">'.php'</span><span style="color: #339933;">;</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="color: #0000ff;">'lib/'</span><span style="color: #339933;">.</span><span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">,</span><span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'_'</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="color: #0000ff;">'.php'</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
     <span style="color: #b1b100;">require_once</span> <span style="color: #000088;">$nomeArquivo</span><span style="color: #339933;">;</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: #339933;">;</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: #339933;">;</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 &#8216;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" 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="color: #0000ff;">'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="color: #0000ff;">'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="color: #0000ff;">'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="color: #0000ff;">'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: #339933;">;</span>
                         <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'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: #339933;">;</span>
                         <span style="color: #b1b100;">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: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
               <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'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="color: #0000ff;">'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="color: #0000ff;">'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: #339933;">;</span>
                         <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'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: #339933;">;</span>
                         <span style="color: #b1b100;">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: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
               <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span> <span style="color: #0000ff;">'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: #339933;">;</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" 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="color: #0000ff;">'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="color: #0000ff;">'module'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">;</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="color: #0000ff;">'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="color: #0000ff;">'action'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">;</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: #339933;">;</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><span style="color: #339933;">;</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="color: #0000ff;">'command/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$module</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$action</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.php'</span><span style="color: #339933;">;</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: #339933;">;</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="color: #0000ff;">'Command'</span><span style="color: #339933;">;</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: #339933;">;</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="color: #0000ff;">'Erro 404 - Página não encontrada'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #009900;">&#125;</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<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/wp-content/uploads/2010/12/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/2010/12/criando-um-framework-php-do-zero-usando-padroes-de-projeto-parte-1/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

