<?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>Cauan Cabral &#187; CakePHP</title> <atom:link href="http://cauancabral.net/category/cakephp/feed/" rel="self" type="application/rss+xml" /><link>http://cauancabral.net</link> <description>Geek, nerd e apaixonado por tecnologia</description> <lastBuildDate>Sat, 24 Sep 2011 22:13:29 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>Mantendo uma base de código organizada e documentada</title><link>http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/</link> <comments>http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/#comments</comments> <pubDate>Sun, 09 Jan 2011 16:17:43 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[Desenvolvimento Web]]></category> <category><![CDATA[Programação]]></category> <category><![CDATA[Projetos]]></category> <category><![CDATA[ambiente de trabalho]]></category> <category><![CDATA[desenvolvimento]]></category> <category><![CDATA[dicas]]></category> <category><![CDATA[ferramentas]]></category> <category><![CDATA[Radig]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=257</guid> <description><![CDATA[Uma problemática comum de quem desenvolve sistemas é como manter a documentação em dia, se que isso comprometa os prazos de desenvolvimento. Digamos que isso é um problema de otimização: um código bem documentado facilita e muito a sua manutenção; &#8230; <a
href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Uma problemática comum de quem desenvolve sistemas é como manter a documentação em dia, se que isso comprometa os prazos de desenvolvimento.</p><p>Digamos que isso é um problema de otimização:</p><ol><li>um código bem documentado facilita e muito a sua manutenção;</li><li>documentar código leva tempo;</li><li>tempo é um recurso escasso em desenvolvimento de software;</li></ol><p>Olha o problema&#8230; sem tempo, não há documentação e sem documentação você precisará de mais tempo para dar manutenção &#8211; oras, mas você já <strong>não tinha tempo</strong> para documentar, como vai ter <strong>mais tempo</strong> agora para dar manutenção?</p><p>Tentando equacionar esse problema surgiram várias ferramentas que visam facilitar todas as atividades relacionadas ao desenvolvimento.</p><p>Como a maior parte do meu tempo dedico ao PHP e CakePHP, tomarei estes como base para as ferramentas, porém várias delas podem ser utilizadas com outras linguagens/frameworks sem grandes problemas ou então possuem similares em outras linguagens.</p><h3>Padrão de código</h3><p>A primeira etapa, e talvez a mais importante, seja definir e disponibilizar um conjunto de regras explicando como o código foi escrito.</p><p>Este padrão envolve nome de classes, atributos, métodos, comentários, tabelas e colunas do banco de dados, organização de diretórios dentre outras coisas. Até coisas simples como a indentação deve ser padronizada.</p><p>Veja alguns guias de codificação para ter um exemplo do que quero dizer:</p><ul><li><a
title="Coding Standards do WordPress" href="http://codex.wordpress.org/WordPress_Coding_Standards" onclick="pageTracker._trackPageview('/outgoing/codex.wordpress.org/WordPress_Coding_Standards?referer=');">WordPress</a></li><li><a
title="Princípios do CakePHP" href="http://book.cakephp.org/view/892/Basic-Principles-of-CakePHP" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/view/892/Basic-Principles-of-CakePHP?referer=');">CakePHP</a></li><li><a
title="Joomla! Coding style and standards" href="http://docs.joomla.org/Coding_style_and_standards" onclick="pageTracker._trackPageview('/outgoing/docs.joomla.org/Coding_style_and_standards?referer=');">Joomla!</a></li></ul><h3>Versionamento de código</h3><p>Um dos recursos mais importantes durante o desenvolvimento é a capacidade de se desfazer determinada alteração e manter um registro de todas as alterações feitas durante o desenvolvimento.</p><p>Atualmente, minha ferramenta favorita para versionamento é o <a
title="Git SCM" href="http://git-scm.com/" onclick="pageTracker._trackPageview('/outgoing/git-scm.com/?referer=');">Git</a> um sistema distribuído de controle de versão. Porém existem vários outros que podem agradar, como o centralizador <a
title="Home of Subversion project" href="http://subversion.apache.org/" onclick="pageTracker._trackPageview('/outgoing/subversion.apache.org/?referer=');">SVN</a> e os também distribuídos <a
title="Hg/Mercurial SCM" href="http://mercurial.selenic.com/" onclick="pageTracker._trackPageview('/outgoing/mercurial.selenic.com/?referer=');">Mercurial</a> e <a
title="página oficial do Bazaar" href="http://bazaar.canonical.com/en/" onclick="pageTracker._trackPageview('/outgoing/bazaar.canonical.com/en/?referer=');">Bazaar</a>.</p><p>É muito fácil trabalhar com qualquer um destes sistemas e após conhecer as facilidades que o versionamento de código lhe proporcionam, você terá dificuldade em trabalhar com código sem controle de versão, pode apostar.</p><p>Caso você opte por um sistema distribuído, dê uma olhada neste modelo de organização para seu código: <a
title="texto em inglês" href="http://nvie.com/posts/a-successful-git-branching-model/" onclick="pageTracker._trackPageview('/outgoing/nvie.com/posts/a-successful-git-branching-model/?referer=');">A successful Git branch model</a></p><h3>Versionamento do Banco de Dados</h3><p>Por melhor que seja o projeto do seu sistema uma coisa sempre ocorrerá: mudança. E isso envolve mais do que código, muitas vezes alterações na estrutura do banco são necessárias.</p><p>Como controlar essas alterações? A resposta é &#8220;Migrations&#8221;</p><p>No CakePHP precisamos de plugins para dar essa capacidade a aplicação, há dois largamente utilizados:</p><ul><li>Projeto do <a
title="Perfil de Juan Basso no Twitter" href="http://twitter.com/jrbasso" onclick="pageTracker._trackPageview('/outgoing/twitter.com/jrbasso?referer=');">Juan Basso</a>: <a
title="Juan Basso Migrations" href="https://github.com/jrbasso/migrations" onclick="pageTracker._trackPageview('/outgoing/github.com/jrbasso/migrations?referer=');">https://github.com/jrbasso/migrations</a></li><li>Projeto do <a
title="Cake Development Corporation" href="http://cakedc.com" onclick="pageTracker._trackPageview('/outgoing/cakedc.com?referer=');">CakeDC</a>: <a
title="CakeDC Migrations" href="https://github.com/CakeDC/migrations" onclick="pageTracker._trackPageview('/outgoing/github.com/CakeDC/migrations?referer=');">https://github.com/CakeDC/migrations</a></li></ul><p>Outros frameworks fornecem suporte &#8220;nativo&#8221; ao recurso, como o <a
title="Página do framework Rails para Ruby" href="http://rubyonrails.org/" onclick="pageTracker._trackPageview('/outgoing/rubyonrails.org/?referer=');">Ruby on Rails</a> e <a
title="Página do Doctrine" href="http://www.doctrine-project.org/" onclick="pageTracker._trackPageview('/outgoing/www.doctrine-project.org/?referer=');">Doctrine </a>para PHP em geral.</p><h3>Testes unitários</h3><p>Acredito que todos os frameworks modernos fornecem suporte a criação de testes unitários em seus projetos. Os testes são uma fase importante do design do software e fundamental para documentação de qualidade.</p><p>O CakePHP até sua versão 1.3 utiliza o framework de testes <a
title="SimpleTest: Teste Unitários para PHP" href="http://www.simpletest.org/" onclick="pageTracker._trackPageview('/outgoing/www.simpletest.org/?referer=');">SimpleTest</a>, porém passará a utilizar o <a
title="Repositório do PHPUnit, padrão &quot;de fato&quot; para testes em PHP" href="https://github.com/sebastianbergmann/phpunit/" onclick="pageTracker._trackPageview('/outgoing/github.com/sebastianbergmann/phpunit/?referer=');">PHPUnit</a> em sua versão 2.0 (atualmente em desenvolvimento).</p><p>Não sabe o que são testes unitários? Bom, segue alguns links sobre o assunto:</p><ul><li><a
title="TDD" href="http://www.improveit.com.br/xp/praticas/tdd" onclick="pageTracker._trackPageview('/outgoing/www.improveit.com.br/xp/praticas/tdd?referer=');">Desenvolvimento Orientado a Testes</a></li><li><a
title="Verbete a respeito de testes" href="http://pt.wikipedia.org/wiki/Teste_de_unidade" onclick="pageTracker._trackPageview('/outgoing/pt.wikipedia.org/wiki/Teste_de_unidade?referer=');">Wikipedia: Testes de Unidade/Unitário</a></li><li><a
title="Outro post sobre o assunto" href="http://www.profissionaisti.com.br/2009/11/tdd-desenvolvimento-orientado-a-testes/" onclick="pageTracker._trackPageview('/outgoing/www.profissionaisti.com.br/2009/11/tdd-desenvolvimento-orientado-a-testes/?referer=');">TDD: Desenvolvimento Orientado a Testes</a></li><li><a
title="Cookbook para versão 1.3" href="http://book.cakephp.org/pt/view/1196/Testes" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/pt/view/1196/Testes?referer=');">Criando Testes com CakePHP</a></li><li><a
title="apresentação de João José Pedrini" href="http://www.slideshare.net/joaojose/testes-automatizados-no-cakephp" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/joaojose/testes-automatizados-no-cakephp?referer=');">Testes Automatizados no CakePHP</a></li><li><a
title="ótimo texto do Gustavo Dutra a respeito" href="http://gustavodutra.com/post/412/como-fazer-testes-unitarios-em-models-no-cakephp/" onclick="pageTracker._trackPageview('/outgoing/gustavodutra.com/post/412/como-fazer-testes-unitarios-em-models-no-cakephp/?referer=');">Como fazer testes unitários em Models no CakePHP</a></li></ul><p>Testes são como controle de versão&#8230; depois que você usa, não vive sem.</p><h3>Documentação</h3><p>Como comentado anteriormente, um passo importante para documentação são os testes unitários. Porém não devem ser o único.</p><p>Uma forma muito eficiente de documentação são os blocos de comentários, no PHP, o padrão PHPDoc é o mais utilizado.</p><p>Existem várias ferramentas que varrem o código de sua aplicação e identificam esses blocos para gerar a documentação, alguns deles são:</p><ul><li><a
title="casa do phpDocumentor" href="http://phpdoc.org" onclick="pageTracker._trackPageview('/outgoing/phpdoc.org?referer=');">phpDocumentor</a>: ferramenta mais utilizada no mundo PHP</li><li><a
title="explicação em português sobre PHPDoc" href="http://www.worldlingo.com/ma/enwiki/pt/PHPDoc" onclick="pageTracker._trackPageview('/outgoing/www.worldlingo.com/ma/enwiki/pt/PHPDoc?referer=');">Mais informação em português sobre PHPDoc</a></li><li><a
title="post ensinando a utilizção do phpDocumentor" href="http://luishenrique.org/blog/posts/php-doc-instalacao-e-uso" onclick="pageTracker._trackPageview('/outgoing/luishenrique.org/blog/posts/php-doc-instalacao-e-uso?referer=');">Documente seu código PHP usando PHPDoc</a></li><li><a
title="Api Generator - plugin para geração de API, baseado no PHPDoc" href="http://cakephp.lighthouseapp.com/projects/42879/home" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42879/home?referer=');">Gerador de Api para CakePHP</a></li></ul><p>Quando sua documentação é concisa e completa, entender o funcionamento da aplicação passa a ser fácil, independente de quando ela foi criada. Quando isso é aliado aos testes unitários, fazer manutenção passa a ser uma atividade mais fácil e gratificante.</p><p>Por fim, é preciso saber o que/quando está errado e como/quando foi corrigido, ajudando na manutenção do histórico e acompanhamento da evolução do software. Para isso temos o tópico a seguir.</p><h3>Controle de Bugs/Atividades</h3><p>Como controlar o que, quando e por quem uma determinada atividade deve ser feita? E como verificar por quem e quando determinada funcionalidade foi implementada? O controle de versão pode fornecer parte destas respostas, mas ficar analisando logs normalmente não é muito comodo. A melhor maneira é utilizar uma ferramenta de controle de bugs/atividades.</p><p>Utilizo no meu dia-a-dia o excelente <a
title="Redmine - Sistema de controle de atividades" href="http://redmine.org" onclick="pageTracker._trackPageview('/outgoing/redmine.org?referer=');">Redmine, </a>um sistema simples porém poderoso para controle de tarefas. Suporta diferentes projetos, sub-projetos, integra-se com vários sistemas de versionamento de código, permite criação de wikis para documentação além de vários outros recursos.</p><p>Além deste, existem vários outros sistemas como o <a
title="página do Bugzilla" href="http://www.bugzilla.org/" onclick="pageTracker._trackPageview('/outgoing/www.bugzilla.org/?referer=');">Bugzilla</a>, <a
title="Trac" href="http://trac.edgewall.org/" onclick="pageTracker._trackPageview('/outgoing/trac.edgewall.org/?referer=');">Trac</a>, <a
title="Mantis - feito em PHP" href="http://www.mantisbt.org/" onclick="pageTracker._trackPageview('/outgoing/www.mantisbt.org/?referer=');">Mantis</a> e <a
title="PHProjekt" href="http://phprojekt.com" onclick="pageTracker._trackPageview('/outgoing/phprojekt.com?referer=');">PHProjekt</a>.</p><h3>Conclusão?</h3><p>Não, não tem conclusão. O texto visa apenas apresentar algumas atividades que juntas ao planejamento e desenvolvimento de software tendem a tornar a vida dos desenvolvedores melhor, seja diminuindo o stress causado por alterações dos requisitos ou manutenção de código mal projetado/escrito, seja tornando o desenvolvimento mais ágil, permitindo mais horas de lazer e descanso e menos fios de cabelo branco.</p><p>A intenção nunca foi cobrir todos os tópicos a exaustão, mas sim apresentar alguns exemplos e motivos para adoção de tais ferramentas/ideias. Caso tenha surgido dúvida a respeito de qualquer item, deixe um comentário =]</p><p>Sentiu a falta de algum item? Utiliza algo de forma diferente? Deixe um comentário também.</p><p>&#8212;&#8212;&#8212;&#8212;-<br
/> Postado originalmente no <a
title="blog mantido pela equipe da Radig TI" href="http://www.radig.com.br/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/" onclick="pageTracker._trackPageview('/outgoing/www.radig.com.br/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/?referer=');">blog da Radig</a></p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/" rel="bookmark" class="crp_title">CakePHP 1.3 quase assado</a></li><li><a
href="http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/" rel="bookmark" class="crp_title">Obrigado pelos peixes SVN</a></li><li><a
href="http://cauancabral.net/2008/09/21/desenvolvimento-rapido/" rel="bookmark" class="crp_title">Desenvolvimento rápido</a></li><li><a
href="http://cauancabral.net/2010/02/08/dica-rapida-otimizando-codigo/" rel="bookmark" class="crp_title">Dica Rápida &#8211; Otimizando código</a></li><li><a
href="http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/" rel="bookmark" class="crp_title">CakePHP &#8211; dúvidas comuns #1</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>[Comitiva] Como utilizar controle de permissão no sistema &#8211; quase tudo mudou</title><link>http://cauancabral.net/2010/08/09/comitiva-como-utilizar-controle-de-permissao-no-sistema-quase-tudo-mudou/</link> <comments>http://cauancabral.net/2010/08/09/comitiva-como-utilizar-controle-de-permissao-no-sistema-quase-tudo-mudou/#comments</comments> <pubDate>Tue, 10 Aug 2010 02:12:01 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Projetos]]></category> <category><![CDATA[comitiva]]></category> <category><![CDATA[phpms]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=239</guid> <description><![CDATA[No último post falei um pouco sobre o sistema de permissões que implantamos no Comitiva. Acontece que após a adição de uma nova funcionalidade (submissão de trabalhos) aquele sistema de permissão começou a ficar ineficiente, e apesar de eu ter &#8230; <a
href="http://cauancabral.net/2010/08/09/comitiva-como-utilizar-controle-de-permissao-no-sistema-quase-tudo-mudou/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>No <a
href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/" title="[Comitiva] Como utilizar controle de permissão no sistema">último post</a> falei um pouco sobre o sistema de permissões que implantamos no Comitiva.</p><p>Acontece que após a adição de uma nova funcionalidade (submissão de trabalhos) aquele sistema de permissão começou a ficar ineficiente, e apesar de <a
href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/comment-page-1/#comment-298">eu ter dito</a> nos comentários que o ideal era implementar o <a
href="http://api.cakephp.org/class/acl-component" onclick="pageTracker._trackPageview('/outgoing/api.cakephp.org/class/acl-component?referer=');">Acl</a> para este controle no sistema, acabei por implementar a <a
href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/comment-page-1/#comment-297">solução sugerida</a> pelo grande <a
href="http://twitter.com/begnini" onclick="pageTracker._trackPageview('/outgoing/twitter.com/begnini?referer=');">Humberto</a> &#8211; que, tomando como ponto inicial o que tínhamos, era o jeito mais simples de solucionar os problemas.</p><p><strong>Então o que mudou?</strong></p><ul><li>Os usuários não possuem mais um &#8220;tipo&#8221;, agora eles pertencem a &#8220;grupos&#8221; (um ou mais);</li><li>A verificação de permissão é feita na classe AppController, de forma genérica, o que elimina a necessidade de reescrever a função de autorização a cada controlador;</li><li>Os grupos que um usuário pertence ficam definidos em um campo &#8220;groups&#8221;, do tipo varchar e são guardados codificados no formato <em>json</em></li><li>Defini um método protegido no AppController para verificar se o usuário logado pertence a um grupo qualquer, facilitando essa operação quando necessário. (o método chama-se <strong><a
href="http://github.com/CauanCabral/Comitiva/blob/master/app_controller.php#L246" onclick="pageTracker._trackPageview('/outgoing/github.com/CauanCabral/Comitiva/blob/master/app_controller.php_L246?referer=');">AppController::__checkGroup($string)</a></strong> )</li></ul><p><strong>O que não mudou?</strong></p><ul><li>As ações continuam tendo como prefixo o grupo que pode acessa-la, sendo assim, a ação <em>ProposalsController::participant_add()</em> está disponível a todos os usuários que pertençam ao grupo &#8220;participant&#8221;</li><li>Todos os usuários registrados pertencem inicialmente ao grupo &#8216;participant&#8217;, porém podem vir a pertencer a outros grupos posteriormente (em adição ao grupo &#8216;participant&#8217;)</li><li>Continua sendo muito fácil saber se o  usuário logado pode ou não efetuar uma ação, basta usar o método supracitado <em>__checkGroup.</em></li></ul><p>Exemplo de como verificar se o usuário é administrador</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__checkGroup<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'O usuário logado é administrador'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'O usuário logado não é administrador'</span><span style="color: #339933;">;</span></pre></div></div><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/" rel="bookmark" class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema</a></li><li><a
href="http://cauancabral.net/2010/04/05/dica-rapida-cakephp-1-3-link-com-prefixo/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP 1.3, link com prefixo</a></li><li><a
href="http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/" rel="bookmark" class="crp_title">Obrigado pelos peixes SVN</a></li><li><a
href="http://cauancabral.net/2010/04/05/comitiva-cuide-bem-do-seu-evento/" rel="bookmark" class="crp_title">Comitiva &#8211; Cuide bem do seu evento</a></li><li><a
href="http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 2</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/08/09/comitiva-como-utilizar-controle-de-permissao-no-sistema-quase-tudo-mudou/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>[Comitiva] Como utilizar controle de permissão no sistema</title><link>http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/</link> <comments>http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/#comments</comments> <pubDate>Sun, 01 Aug 2010 16:14:10 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Projetos]]></category> <category><![CDATA[comitiva]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=235</guid> <description><![CDATA[Como escrevi anteriormente, o PHPMS mantém um sistema para gerenciar eventos &#8211; desde a divulgação de informações, cadastro de eventos, inscrições, pagamentos, envio de mensagens para inscritos e check-in. Mas o objetivo deste post não é dizer o que já &#8230; <a
href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Como <a
title="Comitiva - Cuide bem do seu evento" href="http://cauancabral.net/2010/04/05/comitiva-cuide-bem-do-seu-evento/">escrevi anteriormente</a>, o PHPMS mantém um sistema para gerenciar eventos &#8211; desde a divulgação de informações, cadastro de eventos, inscrições, pagamentos, envio de mensagens para inscritos e check-in.</p><p>Mas o objetivo deste post não é dizer o que já foi dito, quero iniciar uma série de posts onde vou explicar o funcionamento de alguns recursos dentro do <em><a
href="http://github.com/CauanCabral/Comitiva" title="Pegue uma cópia do Comitiva e contribua" onclick="pageTracker._trackPageview('/outgoing/github.com/CauanCabral/Comitiva?referer=');">Comitiva</a></em>, convidando todos os desenvolvedores a opinar sobre implementação e contribuir com o projeto.</p><p>O assunto de hoje é controle de acesso, então vamos ao que interessa.</p><p><strong>Como funciona o controle de acesso no Comitiva?</strong></p><p>Utilizamos o componente <em>Auth</em> do CakePHP para cuidar da autenticação (efetuar login, verificar se o usuário está logado e efetuar logout).<br
/> Mas precisávamos ir um pouco além da configuração básica, definindo diferentes opções para diferentes tipos de usuários. Para isso, consideramos duas opções iniciais: usar também o <strong>Acl</strong> <em>Behavior</em> ou ficar apenas com o AuthComponent e criar diferentes <em>actions</em> para diferentes tipos de usuários.</p><p>Como possuímos apenas dois tipos de usuários (<em>admin</em> e <em>participant</em>) decidimos pela que seria mais simples inicialmente &#8211; mesmo sabendo que a manutenção no futuro poderia ser mais complicada &#8211; que foi criar diferentes <em>actions</em> para os tipos de usuários.</p><p>Para criar essa funcionalidade, definimos inicialmente um prefixo para cada tipo de usuário (prefixos &#8216;<em>admin</em>&#8216; e &#8216;<em>participant</em>&#8216;). Em seguida configuramos o <strong>AuthComponent</strong> desta maneira (código extraído do <em>AppController</em>):</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Configure AuthComponent</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">authorize</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'controller'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'prefix'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">in_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'prefix'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> Configure<span style="color: #339933;">::</span><span style="color: #004000;">read</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Routing.prefixes'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</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;">// all non-prefixed actions are allowed</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'*'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div><p>Ou seja, toda ação que não tiver prefixo ou o prefixo não estiver definido nas configurações de rota serão públicas (assim é possível, por exemplo, deixar uma página com instruções acessível à qualquer usuário).</p><p>Mas como fica essa verificação de tipos no controlador? Como definimos o método de autorização do Auth como &#8216;controller&#8217;, precisamos definir em todos os controladores o método <strong>isAuthorized</strong> que deve retornar <em>true</em> quando o acesso é aprovado e <em>false</em> caso contrário.<br
/> Seguindo a ideia de que cada tipo de usuário possui um prefixo próprio nas ações, nosso método <em>isAuthorized</em> fica desta forma:</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">userLogged</span> <span style="color: #339933;">==</span> <span style="color: #009900; font-weight: bold;">TRUE</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'prefix'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> User<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'type'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span></pre></div></div><p>Onde o atributo <em>$this->userLogged</em> pertence a classe <em>AppController</em> e sua função é reduzir chamada ao método <em>$Auth->login()</em> e na segunda parte da condição temos uma comparação entre o prefixo da url acessada e o tipo do usuário &#8211; se ambos forem iguais, então o acesso está liberado.</p><p>Por fim, devemos criar nossas ações para cada tipo de usuário, onde o prefixo será usado para validar o acesso à aquela ação, veja o exemplo da ação &#8220;listar pagamentos&#8221;:</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// ação exclusiva para admin - tem acesso aos pagamentos de todos os outros usuários</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> admin_index<span style="color: #009900;">&#40;</span><span style="color: #000088;">$event_id</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</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;">Subscription</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">recursive</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">is_numeric</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$event_id</span><span style="color: #009900;">&#41;</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;">paginate</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'conditions'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
				<span style="color: #0000ff;">'event_id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$event_id</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: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">compact</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'event_id'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'subscriptions'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">paginate</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: #666666; font-style: italic;">// ação exclusiva para participant - tem acesso somente aos próprios pagamentos</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> participant_index<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;">Subscription</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">recursive</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'subscriptions'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">paginate</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user_id'</span> <span style="color: #339933;">=&gt;</span> User<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#41;</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></pre></div></div><p>Como podem ver, isso permite a criação de diferentes regras de negócio para os diferentes tipos de usuários e embora aumente a quantidade de código &#8220;redundante&#8221; por repetir alguns procedimentos para todos os tipos de usuários, a leitura e entendimento do código é facilitada &#8211; basta ver o prefixo do método (ação) para saber quem terá acesso a ele.</p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2010/04/05/dica-rapida-cakephp-1-3-link-com-prefixo/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP 1.3, link com prefixo</a></li><li><a
href="http://cauancabral.net/2010/08/09/comitiva-como-utilizar-controle-de-permissao-no-sistema-quase-tudo-mudou/" rel="bookmark" class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema &#8211; quase tudo mudou</a></li><li><a
href="http://cauancabral.net/2010/01/28/dica-rapida-cakephp-personalizando-as-paginas-de-erros/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP &#8211; Personalizando as páginas de erros</a></li><li><a
href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/" rel="bookmark" class="crp_title">CakePHP &#8211; Dúvidas Comuns #2</a></li><li><a
href="http://cauancabral.net/2008/01/03/validacao-de-dados-em-php5-parte-2/" rel="bookmark" class="crp_title">Validação de dados em PHP5 &#8211; Parte 2</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Obrigado pelos peixes SVN</title><link>http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/</link> <comments>http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/#comments</comments> <pubDate>Sun, 11 Apr 2010 13:08:59 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Programação]]></category> <category><![CDATA[CakePHP-1.3]]></category> <category><![CDATA[comitiva]]></category> <category><![CDATA[git]]></category> <category><![CDATA[github]]></category> <category><![CDATA[svn]]></category> <category><![CDATA[swiftmailer]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=220</guid> <description><![CDATA[Há alguns anos descobri o fantástico mundo do controle de versão, naquele momento me perguntei &#8220;como vivi sem isso até hoje?&#8221;. Dali em diante podia alterar arquivos sem medo, qualquer erro era só voltar uma versão e tudo certo. Trabalhar &#8230; <a
href="http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Há alguns anos descobri o fantástico mundo do controle de versão, naquele momento me perguntei &#8220;como vivi sem isso até hoje?&#8221;. Dali em diante podia alterar arquivos sem medo, qualquer erro era só voltar uma versão e tudo certo. Trabalhar em equipe finalmente se tornava algo fácil, graças ao <a
title="Página do Subversion SCM" href="http://subversion.apache.org/" onclick="pageTracker._trackPageview('/outgoing/subversion.apache.org/?referer=');">Subversion &#8211; SVN</a>.</p><p>Porém os anos passaram e algumas coisas começaram a fazer falta: como faço quando estou desenvolvendo algo grande, fico sem commitar até ter algo estável/usável? crio um branch para isso? mas e depois para unir os branches, e os conflitos? além disso, se só eu estou trabalhando em cima disso, porque commitar para todo mundo algo não pronto?</p><p>Foi aí que descobri o <a
title="Página com documentação do Git SCM" href="http://git-scm.com/" onclick="pageTracker._trackPageview('/outgoing/git-scm.com/?referer=');">GIT</a>, um sistema de controle de versão distribuído, open source e gratuito. Ok, ele é gratuito e open source, mas isso não é motivo suficiente. Como disse, ele é um sistema de controle de versão distribuído, isso quer dizer que cada um que tem uma cópia do repositório tem de fato uma cópia dele, e pode servir outras pessoas, ver histórico, tudo localmente.</p><p>Então de quebra, ele resolve o problema de ter de criar um branch para desenvolver uma funcionalidade que só eu vou mexer, posso controlar cada alteração minha localmente, e quando quiser &#8211; se quiser &#8211; posso sincronizar meu repositório local com um outro central (que eu considero central, já que essa figura não existe no GIT). E mais, ele é <strong>MUITO RÁPIDO</strong>. Acho que para ajudar na argumentação de que é rápido basta dizer que ele foi feito por alguns desenvolvedores do Kernel Linux, e gerencia todo o código trabalhado por eles &#8211; e não é pouca coisa.</p><p>Ainda estou caminhando com o <a
href="http://git-scm.com/" onclick="pageTracker._trackPageview('/outgoing/git-scm.com/?referer=');">GIT</a>, tenho aproveitado minha ânsia de aprende-lo junto com a de contribuir com softwares open source para criar e disponibilizar projetos no <a
title="Plataforma para centralização de repositórios Git" href="http://github.com" onclick="pageTracker._trackPageview('/outgoing/github.com?referer=');">GitHub</a>.</p><p>A grande maioria dos projetos é voltado ao <a
title="CakePHP Framework" href="http://cakephp.org" onclick="pageTracker._trackPageview('/outgoing/cakephp.org?referer=');">CakePHP</a>, mas há outras coisas também. Alguns projetos que podem interessar são:</p><ul><li><a
title="Sistema de gerenciamento de eventos escrito em CakePHP" href="http://github.com/CauanCabral/Comitiva" onclick="pageTracker._trackPageview('/outgoing/github.com/CauanCabral/Comitiva?referer=');">Comitiva</a> &#8211; Sistema construído em CakePHP 1.3 para gerenciamento de eventos;</li><li><a
title="Plugin que serve de wrapper para utilização da biblioteca SwiftMailer dentro do CakePHP" href="http://github.com/CauanCabral/Mailer" onclick="pageTracker._trackPageview('/outgoing/github.com/CauanCabral/Mailer?referer=');">Plugin Mailer</a> &#8211; Um plugin que ajuda na utilização da biblioteca PHP <a
title="Página da lib SwiftMailer" href="http://swiftmailer.org" onclick="pageTracker._trackPageview('/outgoing/swiftmailer.org?referer=');">SwiftMailer</a> dentro do CakePHP;</li><li><a
title="Behavior para transformação de dados" href="http://github.com/CauanCabral/CakePHP-Locale-Behavior" onclick="pageTracker._trackPageview('/outgoing/github.com/CauanCabral/CakePHP-Locale-Behavior?referer=');">Behavior Locale</a> &#8211; Um behavior para transformar dados vindo do usuário de seu padrão local para um padrão internacional (de banco de dados)</li><li><a
title="Classes de apoio em PHP" href="http://github.com/CauanCabral/libs" onclick="pageTracker._trackPageview('/outgoing/github.com/CauanCabral/libs?referer=');">Libs</a> &#8211; uma coleção de pequenos scripts PHP que fui fazendo ao longo da vida. Há coisas boas, coisas úteis, coisas não tão úteis, mas tudo pode ser usado ao menos como ponto inicial para uma implementação mais elaborada.</li></ul><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/" rel="bookmark" class="crp_title">Mantendo uma base de código organizada e documentada</a></li><li><a
href="http://cauancabral.net/2010/04/05/comitiva-cuide-bem-do-seu-evento/" rel="bookmark" class="crp_title">Comitiva &#8211; Cuide bem do seu evento</a></li><li><a
href="http://cauancabral.net/2008/01/17/sentiram-falta/" rel="bookmark" class="crp_title">Sentiram falta?</a></li><li><a
href="http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/" rel="bookmark" class="crp_title">CakePHP 1.3 quase assado</a></li><li><a
href="http://cauancabral.net/2010/08/09/comitiva-como-utilizar-controle-de-permissao-no-sistema-quase-tudo-mudou/" rel="bookmark" class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema &#8211; quase tudo mudou</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Dica Rápida &#8211; CakePHP 1.3, link com prefixo</title><link>http://cauancabral.net/2010/04/05/dica-rapida-cakephp-1-3-link-com-prefixo/</link> <comments>http://cauancabral.net/2010/04/05/dica-rapida-cakephp-1-3-link-com-prefixo/#comments</comments> <pubDate>Tue, 06 Apr 2010 03:11:40 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[CakePHP-1.3]]></category> <category><![CDATA[dica]]></category> <category><![CDATA[prefixos]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=217</guid> <description><![CDATA[Quando estávamos criando o Comitiva, decidimos utilizar o novo recurso do CakePHP que permite definir diferentes prefixos. Em nosso caso, cada prefixo representa um tipo de usuário. A ideia ia bem, até termos que criar um link explicitando uma rota. &#8230; <a
href="http://cauancabral.net/2010/04/05/dica-rapida-cakephp-1-3-link-com-prefixo/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Quando estávamos criando o Comitiva, decidimos utilizar o novo recurso do CakePHP que permite definir diferentes prefixos.</p><p>Em nosso caso, cada prefixo representa um tipo de usuário.</p><p>A ideia ia bem, até termos que criar um link explicitando uma rota.</p><p>Por padrão, a classe Router reconhece o prefixo em uso no momento e adiciona ele na url que você está construindo, desta forma se eu estiver acessando um endereço http://comitiva/participant/events  e quiser criar um link para a url http://comitiva/admin/users  eu terei um problema (não documentado): a segunda url ficaria http://comitiva/partipant/users , por causa da página que está ativa no momento.</p><p>A solução foi me apresentada no IRC, canal #cakephp-pt pelo padeiro <strong>Danielpk</strong>: adicione um índice com o nome do prefixo associado ao valor TRUE no array de endereço.  Fica algo assim:</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Html</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Administre os usuários'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'users'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'admin'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</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;">// ou, caso queira forçar o prefixo participant</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Html</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Veja os usuários'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'users'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'participant'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/" rel="bookmark" class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema</a></li><li><a
href="http://cauancabral.net/2010/08/09/comitiva-como-utilizar-controle-de-permissao-no-sistema-quase-tudo-mudou/" rel="bookmark" class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema &#8211; quase tudo mudou</a></li><li><a
href="http://cauancabral.net/2010/01/28/dica-rapida-cakephp-personalizando-as-paginas-de-erros/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP &#8211; Personalizando as páginas de erros</a></li><li><a
href="http://cauancabral.net/2010/01/27/dica-rapida/" rel="bookmark" class="crp_title">Dica rápida</a></li><li><a
href="http://cauancabral.net/2008/02/10/validao-de-dados-em-php5-final/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; final</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/04/05/dica-rapida-cakephp-1-3-link-com-prefixo/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Comitiva &#8211; Cuide bem do seu evento</title><link>http://cauancabral.net/2010/04/05/comitiva-cuide-bem-do-seu-evento/</link> <comments>http://cauancabral.net/2010/04/05/comitiva-cuide-bem-do-seu-evento/#comments</comments> <pubDate>Tue, 06 Apr 2010 02:48:18 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[Projetos]]></category> <category><![CDATA[CakePHP-1.3]]></category> <category><![CDATA[comitiva]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=215</guid> <description><![CDATA[Na última semana o PHPMS realizou seu 3º Workshop, que mais uma vez, foi um sucesso. Como comentei no post anterior, dessa vez minha participação foi focada em um ponto: criar uma solução para gerenciar as inscrições do evento. Dessa &#8230; <a
href="http://cauancabral.net/2010/04/05/comitiva-cuide-bem-do-seu-evento/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Na última semana o <a
title="Grupo de Desenvolvedores PHP de MS" href="http://phpms.org" onclick="pageTracker._trackPageview('/outgoing/phpms.org?referer=');">PHPMS</a> realizou seu <a
title="3º Workshop promovido pelo PHPMS" href="http://phpms.org/workshops/19-workshops/225-3d-workshop-do-phpms-inscricoes-abertas" onclick="pageTracker._trackPageview('/outgoing/phpms.org/workshops/19-workshops/225-3d-workshop-do-phpms-inscricoes-abertas?referer=');">3º Workshop</a>, que mais uma vez, foi um sucesso.</p><p>Como comentei no post anterior, dessa vez minha participação foi focada em um ponto: criar uma solução para gerenciar as inscrições do evento.</p><p>Dessa necessidade surgiu o <a
title="Casa do Comitiva" href="http://phpms.lighthouseapp.com/projects/49894-comitiva/overview" onclick="pageTracker._trackPageview('/outgoing/phpms.lighthouseapp.com/projects/49894-comitiva/overview?referer=');">Comitiva</a>, um sistema de gerenciamento de eventos, que nasceu a pouco e já passou pela sua primeira prova de teste (o próprio workshop).</p><p>No momento ele pode ser usado para cadastrar um evento, permitir que usuários se cadastrem e se inscrevam nos eventos cadastrados, mas vários outros recursos já estão em andamento.</p><p>A parte boa é que o sistema é livre &#8211; sim, open source, é gratuito e feito em <a
title="CakePHP home page" href="http://www.cakephp.org" onclick="pageTracker._trackPageview('/outgoing/www.cakephp.org?referer=');">CakePHP</a> 1.3. Estamos utilizando o <a
title="Baixe o código e contribua com ele por aqui" href="http://github.com/CauanCabral/Comitiva" onclick="pageTracker._trackPageview('/outgoing/github.com/CauanCabral/Comitiva?referer=');">Github</a> para gerenciar o código e hoje criei uma conta no <a
title="Reporte bugs e sugira recursos aqui!" href="http://phpms.lighthouseapp.com/projects/49894-comitiva/overview" onclick="pageTracker._trackPageview('/outgoing/phpms.lighthouseapp.com/projects/49894-comitiva/overview?referer=');">LighthouseApp</a> para gerenciar as tarefas. Aliás, queria agradecer e recomendar ambos os serviços que suportam, sem custos, projetos open source. Valeu =]</p><p>Veja um demo na versão instalada para o PHPMS: <a
title="Gerenciamento de eventos do PHPMS" href="http://comitiva.phpms.org" onclick="pageTracker._trackPageview('/outgoing/comitiva.phpms.org?referer=');">http://comitiva.phpms.org</a></p><p>Bom, como uma andorinha só não faz verão, o Comitiva contou com alguns colaboradores/apoiadores que gostaria de citar e agradecer aqui:</p><p><a
title="Blog do José Agripino Duarte" href="http://agripinoduarte.radig.com.br/" onclick="pageTracker._trackPageview('/outgoing/agripinoduarte.radig.com.br/?referer=');">Zé Agripino</a>: fez boa parte do trabalho sujo, hehehe. Criar as views, traduzir textos, corrigir bugs. Ajudou em todo o sistema, é O cara;<br
/> <a
title="linkei o currículo, nerd sem blog é foda" href="http://br.linkedin.com/in/felipevargasrigo/pt" onclick="pageTracker._trackPageview('/outgoing/br.linkedin.com/in/felipevargasrigo/pt?referer=');">Felipe V. Rigo</a>: começando a trabalhar com CakePHP agora, apanhou um pouco para conseguir rodar o sistema em sua máquina, mas graças a isso e sua persistência descobrimos e corrigimos vários bugs do sistema;<br
/> <a
title="Blog do Zehzinho" href="http://www.josericardo.eti.br/" onclick="pageTracker._trackPageview('/outgoing/www.josericardo.eti.br/?referer=');">José Ricardo</a>: estava ocupado no inicio do projeto, porém após o workshop ficou animadão e já fez algumas contribuições importantes, como a configuração do Migrations para o sistema;<br
/> <a
title="Blog do Bruno Porkaria" href="http://porkaria.com.br" onclick="pageTracker._trackPageview('/outgoing/porkaria.com.br?referer=');">Bruno Porkaria</a>: também estava bem corrido e cuidando de outras coisas do workshop, mas testou bastante o sistema e teve a paciência de reportar problemas e sugestões sempre que estas apareciam.</p><p>É isso aí, espero trazer mais novidades em breve, principalmente sobre o projeto =]</p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2010/03/20/3%c2%ba-workshop-do-phpms/" rel="bookmark" class="crp_title">3º Workshop do PHPMS</a></li><li><a
href="http://cauancabral.net/2009/07/11/1%c2%ba-workshop-phpms-php-extremo-sucesso/" rel="bookmark" class="crp_title">1º Workshop PHPMS &#8211; PHP Extremo, SUCESSO</a></li><li><a
href="http://cauancabral.net/2009/06/14/workshop-php-extremo/" rel="bookmark" class="crp_title">Workshop PHP Extremo</a></li><li><a
href="http://cauancabral.net/2009/09/24/2%c2%ba-workshop-phpms/" rel="bookmark" class="crp_title">2º Workshop PHPMS</a></li><li><a
href="http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/" rel="bookmark" class="crp_title">Obrigado pelos peixes SVN</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/04/05/comitiva-cuide-bem-do-seu-evento/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Dica Rápida &#8211; Otimizando código</title><link>http://cauancabral.net/2010/02/08/dica-rapida-otimizando-codigo/</link> <comments>http://cauancabral.net/2010/02/08/dica-rapida-otimizando-codigo/#comments</comments> <pubDate>Tue, 09 Feb 2010 01:12:36 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[dica]]></category> <category><![CDATA[otimização]]></category> <category><![CDATA[qualidade]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=203</guid> <description><![CDATA[Há um bom tempo atrás rolou uma discussão na lista do PHPMS sobre um comparativo de performance entre PHP x Python x Ruby x Perl. Bom, a conclusão que tirei do comparativo foi de que a velocidade de execução é &#8230; <a
href="http://cauancabral.net/2010/02/08/dica-rapida-otimizando-codigo/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Há um bom tempo atrás rolou uma discussão na lista do PHPMS sobre um <a
title="PHP x Python x Ruby x Perl" href="http://groups.google.com/group/phpms/browse_thread/thread/f4e76f4d94763866/f76cb1b77f28a25b" onclick="pageTracker._trackPageview('/outgoing/groups.google.com/group/phpms/browse_thread/thread/f4e76f4d94763866/f76cb1b77f28a25b?referer=');">comparativo de performance</a> entre PHP x Python x Ruby x Perl.</p><p>Bom, a conclusão que tirei do comparativo foi de que a velocidade de execução é importante, mas mais do que isso, o programador é essencial. No exemplo da thread supracitada, o PHP perdia feio para as outras linguagens, mas olhando para o código escrito em PHP, dava para notar  vários erros de uso da linguagem e suas funções (ponto para o <a
href="http://twitter.com/begnini" onclick="pageTracker._trackPageview('/outgoing/twitter.com/begnini?referer=');">Begnini</a> que viu o código antes de todos).</p><p>Então a dica de hoje é: estude bem a linguagem. Procure a saber o funcionamento das funções e construções da linguagem, isso é essencial para se tornar um bom programador.</p><p>Exemplos de código</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//uso comum</span>
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
  <span style="color: #339933;">...</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//forma mais adequada</span>
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$c</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span>
 <span style="color: #339933;">...</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//outro caso, ao invés de forçar várias verificações</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">100</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #339933;">...</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">100</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #339933;">...</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">100</span> <span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//use a estrutura adequada</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">100</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #339933;">...</span>
<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$a</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">100</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #339933;">...</span>
<span style="color: #b1b100;">else</span> <span style="color: #666666; font-style: italic;">//não precisa fazer o último teste</span>
 <span style="color: #339933;">...</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// esse último caso que me inspirou a fazer o post</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// a pessoa só queria saber se o array $var tava vazio, e para isso contou todos os seus elementos</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #339933;">...</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// enquanto ela poderia ter usado uma verificação direta como</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span></pre></div></div><p>Este último caso, que motivou o post foi visto no changelog da versão 1.2.6 do CakePHP. Neste caso o &#8220;erro&#8221; foi encontrado e corrigido pelo brasileiro <a
title="Blog do Juan Basso" href="http://blog.cakephp-brasil.org/" onclick="pageTracker._trackPageview('/outgoing/blog.cakephp-brasil.org/?referer=');">Juan Basso</a> neste <a
title="Commit do Juan Basso para o CakePHP 1.2.6 - otimizações" href="http://github.com/cakephp/cakephp1x/commit/a96c157d948e2f3c1fa55b5d422121c323859626" onclick="pageTracker._trackPageview('/outgoing/github.com/cakephp/cakephp1x/commit/a96c157d948e2f3c1fa55b5d422121c323859626?referer=');">commit</a>.</p><p>O intuito do post não é meter o dedo na cara de ninguém, apenas alertar para situações onde culpamos uma determinada linguagem pelo desempenho de nossa aplicação quando o problema na verdade é o mal uso que estamos fazendo.</p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/" rel="bookmark" class="crp_title">Mantendo uma base de código organizada e documentada</a></li><li><a
href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/" rel="bookmark" class="crp_title">CakePHP &#8211; Dúvidas Comuns #2</a></li><li><a
href="http://cauancabral.net/2008/01/23/validao-de-dados-em-php5-parte-3/" rel="bookmark" class="crp_title">Valida&#231;&#227;o de dados em PHP5 &#8211; Parte 3</a></li><li><a
href="http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/" rel="bookmark" class="crp_title">CakePHP &#8211; dúvidas comuns #1</a></li><li><a
href="http://cauancabral.net/2010/08/13/dica-rapida-evitando-problemas-com-uso-de-jquery-e-imagens/" rel="bookmark" class="crp_title">Dica Rápida &#8211; Evitando problemas com uso de jQuery e imagens</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/02/08/dica-rapida-otimizando-codigo/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Dica Rápida &#8211; CakePHP &#8211; Personalizando as páginas de erros</title><link>http://cauancabral.net/2010/01/28/dica-rapida-cakephp-personalizando-as-paginas-de-erros/</link> <comments>http://cauancabral.net/2010/01/28/dica-rapida-cakephp-personalizando-as-paginas-de-erros/#comments</comments> <pubDate>Thu, 28 Jan 2010 21:46:58 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[dica]]></category> <category><![CDATA[personalização]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=185</guid> <description><![CDATA[A grosso modo, existem dois tipos de erros no CakePHP: Erros de codificação e configuração: Quando acessamos um endereço de nossa aplicação e está faltando alguma coisa, o CakePHP nos retorna uma mensagem avisando sobre o erro ocorrido e a &#8230; <a
href="http://cauancabral.net/2010/01/28/dica-rapida-cakephp-personalizando-as-paginas-de-erros/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>A grosso modo, existem dois tipos de erros no CakePHP:</p><p><strong>Erros de codificação e configuração:</strong></p><p>Quando acessamos um endereço de nossa aplicação e está faltando alguma coisa, o CakePHP nos retorna uma mensagem avisando sobre o erro ocorrido e a causa dele (o que falta fazer).</p><p><strong>Erros HTTP:<br
/> </strong>Quando tentamos acessar um endereço inexistente (erro 404) e quando há falha no servidor (erro 500).</p><p>O primeiro tipo deixa de ser exibido quando você configura o debug para o valor zero. A partir deste momento todos os erros relacionados ao primeiro tipo serão mostrados como um erro 404.<br
/> O segundo tipo é exibido não importando o valor do debug.</p><p><strong>Como personalizar essas mensagens?</strong></p><p>Caso queira usar o mesmo layou definido no arquivo<em> app/views/layouts/default.ctp</em>, você precisará apenas criar uma pasta chamada errors dentro da pasta views  (caso ela não exista) e depois criar um arquivo para cada erro, ficando mais ou menos assim:</p><pre>app/views/errors/error404.ctp
app/views/errors/error500.ctp
app/views/errors/missing_action.ctp
</pre><p> Veja a lista completa de arquivos acessando o diretório <em>cake/libs/views/errors/</em><br
/> Caso queira ir um pouco além, personalizando também o layout da mensagem, adicione um arquivo com o layout definido em <em>app/views/layouts/</em>. Vamos chamar esse arquivo de <em>errors.ctp</em>;<br
/> Em seguida, vamos adicionar o seguinte código em nosso <em>AppController</em>:</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * Caso já esteja usando o beforeRender, apenas adicione a linha interna abaixo ao seu beforeRender
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> beforeRender <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>_setErrorLayout<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> _setErrorLayout<span style="color: #009900;">&#40;</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;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'CakeError'</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;">layout</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'error'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div><p>Pronto, agora é só personalizar o arquivo errors.ctp da forma que achar melhor =]<br
/> Dica retirada do <a
title="Teknoid - nuts and bolts of cakephp" href="http://teknoid.wordpress.com/2009/04/30/give-all-of-your-error-messages-a-different-layout/" onclick="pageTracker._trackPageview('/outgoing/teknoid.wordpress.com/2009/04/30/give-all-of-your-error-messages-a-different-layout/?referer=');">Teknoid</a></p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/" rel="bookmark" class="crp_title">CakePHP &#8211; Dúvidas Comuns #2</a></li><li><a
href="http://cauancabral.net/2010/04/05/dica-rapida-cakephp-1-3-link-com-prefixo/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP 1.3, link com prefixo</a></li><li><a
href="http://cauancabral.net/2010/01/27/dica-rapida/" rel="bookmark" class="crp_title">Dica rápida</a></li><li><a
href="http://cauancabral.net/2010/08/13/dica-rapida-evitando-problemas-com-uso-de-jquery-e-imagens/" rel="bookmark" class="crp_title">Dica Rápida &#8211; Evitando problemas com uso de jQuery e imagens</a></li><li><a
href="http://cauancabral.net/2010/08/01/comitiva-como-utilizar-controle-de-permissao-no-sistema/" rel="bookmark" class="crp_title">[Comitiva] Como utilizar controle de permissão no sistema</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/01/28/dica-rapida-cakephp-personalizando-as-paginas-de-erros/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Dica rápida</title><link>http://cauancabral.net/2010/01/27/dica-rapida/</link> <comments>http://cauancabral.net/2010/01/27/dica-rapida/#comments</comments> <pubDate>Wed, 27 Jan 2010 14:33:55 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[dica]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=180</guid> <description><![CDATA[Ontem estava aplicando algumas ideias encontrada no excelente Super Awesome Advanced CakePHP Tips e me deparei com um erro que ocorria na minha aplicação. PROBLEMA: Ao tentar usar a função file_exists do PHP dentro do arquivo config/bootstrap.php para incluir um &#8230; <a
href="http://cauancabral.net/2010/01/27/dica-rapida/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Ontem estava aplicando algumas ideias encontrada no excelente <a
title="Super Maravilhosas Dicas Avançadas para CakePHP (essa foi minha péssima tradução para o  título)" href="http://www.scribd.com/doc/19344870/Super-Awesome-Advanced-CakePHP-Tips" onclick="pageTracker._trackPageview('/outgoing/www.scribd.com/doc/19344870/Super-Awesome-Advanced-CakePHP-Tips?referer=');"><em>Super Awesome Advanced CakePHP Tips</em></a> e me deparei com um erro que ocorria na minha aplicação.</p><p>PROBLEMA:<br
/> Ao tentar usar a função <em>file_exists</em> do PHP dentro do arquivo config/bootstrap.php para incluir um outro arquivo do mesmo diretório sempre recebia como resposta o valor <em>FALSE</em></p><p>SOLUÇÃO:<br
/> Descobri que ao usar o <em>file_exists</em> o PHP estava tomando como diretório corrente o webroot/ e não o diretório do <em>bootstrap.php</em> (arquivo atual), então tive de acrescentar o prefixo &#8216;../config/&#8217; para encontrar o arquivo que procurava.<br
/> Após usar o <em>file_exists</em>, iria dar um <em>include</em> no arquivo, neste caso o comportamento é diferente: ele considera o diretório corrente como sendo o diretório do arquivo que está chamando a função ( no meu caso o config/), portanto não é preciso adicionar prefixo nenhum.</p><p>Ainda não consegui descobrir o motivo desses dois comportamentos no mesmo ambiente, porém imagino que o comportamento do <em>file_exists</em> está ligado ao arquivo <em>.htaccess</em> do CakePHP que seta para o Apache o diretório <em>webroot/</em> como sendo a raiz do domínio.</p><p>Se souber a resposta deixe-a no comentário que eu atualizo o post.</p><p>Até a próxima.</p><p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br
/> Atualizando conforme combinado &#8211; 27/01/2010<br
/> &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p><p>O Társis deu uma boa dica para evitar esse tipo de problema: utilizar as constantes do CakePHP, no caso da dica do post, a constante utilizada seria <em>CONFIGS</em>, ela contém o caminho completo para o diretório /config.</p><p>A chamada da função ficaria assim:</p><div
class="wp_syntax"><div
class="code"><pre class="php" style="font-family:monospace;"><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>CONFIGS <span style="color: #339933;">.</span> <span style="color: #0000ff;">'arquivo.php'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span> CONFIGS <span style="color: #339933;">.</span> <span style="color: #0000ff;">'arquivo.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div><p>Além da constante CONFIGS temos algumas outras, como a WWW_ROOT e IMAGES que seguem o mesmo princípio, mas para apontar o caminho completo do diretório /webroot e /webroot/img respectivamente.<br
/> Veja a lista completa de constantes em <a
title="Constantes pré-definidas do CakePHP" href="http://book.cakephp.org/view/122/Core-Definition-Constants" onclick="pageTracker._trackPageview('/outgoing/book.cakephp.org/view/122/Core-Definition-Constants?referer=');">http://book.cakephp.org/view/122/Core-Definition-Constants</a></p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2010/01/28/dica-rapida-cakephp-personalizando-as-paginas-de-erros/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP &#8211; Personalizando as páginas de erros</a></li><li><a
href="http://cauancabral.net/2010/04/05/dica-rapida-cakephp-1-3-link-com-prefixo/" rel="bookmark" class="crp_title">Dica Rápida &#8211; CakePHP 1.3, link com prefixo</a></li><li><a
href="http://cauancabral.net/2009/01/14/ajax-com-prototype/" rel="bookmark" class="crp_title">AJAX com Prototype</a></li><li><a
href="http://cauancabral.net/2009/02/25/cakephp-duvidas-comuns-2/" rel="bookmark" class="crp_title">CakePHP &#8211; Dúvidas Comuns #2</a></li><li><a
href="http://cauancabral.net/2009/02/23/cakephp-duvidas-comuns-1/" rel="bookmark" class="crp_title">CakePHP &#8211; dúvidas comuns #1</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/01/27/dica-rapida/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>CakePHP 1.3 quase assado</title><link>http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/</link> <comments>http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/#comments</comments> <pubDate>Wed, 27 Jan 2010 02:49:50 +0000</pubDate> <dc:creator>Cauan Cabral</dc:creator> <category><![CDATA[CakePHP]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[CakePHP-1.3]]></category> <category><![CDATA[desenvolvimento]]></category> <guid
isPermaLink="false">http://cauancabral.net/?p=178</guid> <description><![CDATA[Pouco mais de um ano após o lançamento da versão 1.2.0 do CakePHP, está para ser lançado, dia 13 de fevereiro, a versão 1.3 deste poderoso framework. Tenho feito alguns testes em cima dele, estou inclusive reescrevendo um pequeno CMS &#8230; <a
href="http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/">Continue reading <span
class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Pouco mais de um ano após o lançamento da versão 1.2.0 do CakePHP, está para ser lançado, dia 13 de fevereiro, a versão 1.3 deste poderoso framework.</p><p>Tenho feito alguns testes em cima dele, estou inclusive reescrevendo um pequeno CMS que possuímos na empresa em cima desta versão (árvore 1.3-dev do repositório do projeto) e apesar de alguns pequenos bugs (ainda é uma versão de desenvolvimento, né?) esta versão possui muitas melhorias na sintaxe &#8211; que agora está mais concisa &#8211;  e novas funcionalidades.</p><p>Para a migração de nossa aplicação, não foi preciso alterar muita coisa, porém para grandes aplicações, deve-se considerar a necessidade do upgrade.</p><p>Abaixo segue uma lista de links para algumas páginas com informações sobre esta nova versão do CakePHP (todas em inglês):</p><ul><li><a
title="TODO list do CakePHP 1.3" href="http://cakephp.lighthouseapp.com/projects/42648/13-todo-list" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42648/13-todo-list?referer=');">Lista de <em>TODO</em> (tudo que já foi realizado está riscado)</a></li><li><a
title="Lista de novas funcionalidades/recursos do CakePHP 1.3" href="http://cakephp.lighthouseapp.com/projects/42648/13-new-features" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42648/13-new-features?referer=');">Novas <em>features</em></a></li><li><a
title="Guia de migração de uma aplicação utilizando CakePHP da versão 1.2 para a 1.3" href="http://cakephp.lighthouseapp.com/projects/42648/13-migration-guide" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42648/13-migration-guide?referer=');">Guia de migração (upgrade de aplicação feita com o CakePHP 1.2 para 1.3)</a></li></ul><p>Caso tenha interesse em ajudar os desenvolvedores, baixe a <a
title="Fonte do CakePHP 1.3 no GitHub" href="http://github.com/cakephp/cakephp1x/tree/1.3" onclick="pageTracker._trackPageview('/outgoing/github.com/cakephp/cakephp1x/tree/1.3?referer=');">versão em desenvolvimento</a> e faça alguns testes. Só não esqueça de <a
title="Tickets do Cake 1.x" href="http://cakephp.lighthouseapp.com/projects/42648-cakephp-1x/tickets" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42648-cakephp-1x/tickets?referer=');">reportar</a> eventuais problemas ou patchs que você venha a produzir. Não se preocupem com o tempo de resposta da equipe de desenvolvimento, eles realmente estão empenhados em fazer um bom trabalho, é possível que tenha feedback de seu ticket/patch em menos de 1 hora &#8211; experiência própria.</p><p>Logo que concluir algumas tarefas e tiver feito mais testes colocarei aqui meu &#8220;parecer&#8221; sobre a nova versão, enquanto isso <a
title="Informações de desenvolvimento do CakePHP 1.x" href="http://cakephp.lighthouseapp.com/projects/42648-cakephp-1x/overview" onclick="pageTracker._trackPageview('/outgoing/cakephp.lighthouseapp.com/projects/42648-cakephp-1x/overview?referer=');">acompanhe a página de desenvolvimento</a> para ficar por dentro das atualizações.</p><div
id="crp_related"><h3>Outros posts que podem interessar:</h3><ul><li><a
href="http://cauancabral.net/2010/04/05/comitiva-cuide-bem-do-seu-evento/" rel="bookmark" class="crp_title">Comitiva &#8211; Cuide bem do seu evento</a></li><li><a
href="http://cauancabral.net/2008/09/21/desenvolvimento-rapido/" rel="bookmark" class="crp_title">Desenvolvimento rápido</a></li><li><a
href="http://cauancabral.net/2011/01/09/mantendo-uma-base-de-codigo-organizada-e-documentada/" rel="bookmark" class="crp_title">Mantendo uma base de código organizada e documentada</a></li><li><a
href="http://cauancabral.net/2010/04/11/obrigado-pelos-peixes-svn/" rel="bookmark" class="crp_title">Obrigado pelos peixes SVN</a></li><li><a
href="http://cauancabral.net/2010/01/30/joomla-1-6-o-que-esta-para-chegar/" rel="bookmark" class="crp_title">Joomla! 1.6 &#8211; O que está para chegar&#8230;</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://cauancabral.net/2010/01/26/cakephp-1-3-quase-assad/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>
