Minha análise do CakePHP 3 – Ainda fresco, ainda quente

Publicados: 2022-03-11

No mês passado, a equipe do CakePHP anunciou o lançamento da versão alfa do CakePHP 3. A equipe de desenvolvimento do Cake considera a versão 3 um divisor de águas, portanto, com a versão alfa da versão 3 agora saindo do forno, este artigo leva um um novo olhar para o CakePHP 3 como um framework moderno e eficaz para desenvolvimento PHP.

Este deleite do CakePHP 3 acabou de sair do forno.

Uma breve história

Hoje em dia, existem tantas opções quando se trata de desenvolvimento PHP. À medida que o PHP amadureceu, mais e mais frameworks PHP entraram em cena, fornecendo aos desenvolvedores uma ampla gama de opções. Mas nem sempre foi assim.

Em 2005, quando o PHP 4 ainda era o padrão, não havia frameworks PHP e desenvolver uma abordagem de codificação orientada a objetos em PHP era certamente um desafio. Foi então que surgiu o CakePHP – o primeiro framework PHP MVC. Nos quase 10 anos que se passaram desde que foi lançado, o CakePHP continuou a evoluir, mantendo uma participação de mercado saudável de desenvolvedores PHP.

Quão popular é o framework CakePHP? Está classificado entre os 4 projetos PHP mais populares no GitHub, de cerca de 130.000 projetos, com mais de 18.000 membros no grupo CakePHP Google com 32.000 tópicos. Com 270 colaboradores para o código e 320 colaboradores para a documentação, não há como negar que o CakePHP tem muitos seguidores. A popularidade atual e crescente do CakePHP está bem resumida em um artigo de James Watts, membro principal e gerente da comunidade do CakePHP para a Cake Software Foundation, que entrevistei enquanto escrevia este artigo.

Com a versão 3 do framework agora disponível, espera-se que o CakePHP continue sendo uma força líder no mundo PHP e um grande concorrente em meio ao cenário variado de frameworks PHP de hoje.

O que há de novo na versão 3 do CakePHP?

Esta revisão é baseada na versão alfa do CakePHP 3.0, que incorpora vários novos recursos e aprimoramentos, incluindo:

  • Melhor performance. A versão 3 incorpora melhorias de desempenho para o processo de bootstrap, o processo de roteamento e várias partes do processo para gerar modelos auxiliares.

  • Componentes e auxiliares aprimorados. A versão 3 oferece suporte aprimorado para “mensagens flash” com seus novos FlashHelper e FlashComponent. Além disso, o CookieComponent foi aprimorado, tornando mais fácil separar a configuração de namespaces de cookies e o manuseio de dados de cookies.

  • Gerenciamento de sessão aprimorado. O gerenciamento de sessão sempre foi uma classe estática no CakePHP que provou ser problemática de várias maneiras. Com a versão 3, agora você pode acessar a sessão a partir do objeto de solicitação $this->request->session() . Essa mudança também torna a sessão mais fácil de testar e permite que o CakePHP use o PHPUnit 4.x.

  • Melhor consistência das convenções. O esqueleto do aplicativo e os esqueletos do plug-in foram atualizados para usar a mesma estrutura de diretórios para serem mais consistentes entre si.

  • Temas e plugins mesclados. Um dos principais objetivos do CakePHP 3 era tornar os temas mais poderosos e robustos. Trabalhando em direção a esse objetivo, ficou claro que o que era realmente necessário era que os temas fornecessem os mesmos recursos que os plugins. Assim, qualquer plugin agora pode ser usado como tema, o que também simplifica o empacotamento e a redistribuição.

  • Melhorias ORM. Várias alterações de API foram feitas no ORM (mapeamento relacional de objeto). Mais notavelmente, agora é mais simples especificar associações profundas para operações de salvamento, e algumas convenções foram alteradas para reduzir a curva de aprendizado e a confusão entre os novos usuários.

Além disso, existem alguns recursos adicionais que também estão planejados para serem incorporados na versão beta da versão 3.0. Mais importante:

  • Aprimoramentos de recursos de internacionalização e localização (i18n e L10n)
  • Um substituto para o CacheHelper baseado no Edge Side Include
  • Uma nova API de roteamento para declaração de rota mais simples e rápida

De fato, a versão 3 representa uma atualização significativa além das versões anteriores do CakePHP.

Por que CakePHP?

Embora o CakePHP tenha muitos recursos excelentes, esta revisão se concentra em alguns em particular que realmente ajudam a diferenciá-lo, a saber:

  • Convenção sobre configuração
  • ORM do CakePHP (mapeamento objeto-relacional)
  • Componentes e auxiliares

Convenção sobre configuração

O CakePHP sempre foi sobre desenvolvimento rápido e consistente e, nesse sentido, o CakePHP coloca uma forte ênfase na convenção. Portanto, como Ruby on Rails (do qual o CakePHP se inspirou muito), o CakePHP adere fortemente à convenção sobre o princípio de configuração.

Convenções significam que um desenvolvedor não precisa pensar em “onde as coisas vão” ao aprender como usar o framework CakePHP, já que os padrões para essas regras já estão implementados. Embora seja necessário se familiarizar com as convenções do CakePHP, uma vez dominadas, o desenvolvedor pode se concentrar no desenvolvimento do núcleo, em vez de precisar se preocupar com onde o código é colocado e outros problemas de configuração.

As convenções do CakePHP contrastam fortemente com o próprio PHP, que é uma linguagem bastante liberal. Como resultado de suas convenções, o CakePHP ajuda a garantir mais consistência no estilo e estrutura de codificação em vários desenvolvedores e até mesmo em várias equipes. Ao adotar um conjunto padrão de convenções, o Cake se esforça para tornar o desenvolvimento mais consistente.

Para um esquema de banco de dados, por exemplo, o CakePHP faz certas suposições padrão em termos de como certas variáveis, nomes de tabelas e campos serão nomeados. Especificamente, o Cake espera que:

  • Os nomes das tabelas estarão no plural (por exemplo, orders )
  • O nome do campo de chave primária será id
  • Os nomes de qualquer campo de chave estrangeira serão baseados no nome da tabela referenciada seguido por _id (por exemplo, a chave estrangeira em uma tabela de customers seria denominada customer_id ).

Para ilustrar, vamos considerar uma simples revisão de duas tabelas ( articles e users ) de um banco de dados de postagem de blog. Em nosso exemplo, diremos que um Articles “BelongsTo” a Users e um Users “HasMany” Articles . Esses relacionamentos seriam especificados da seguinte forma no CakePHP 3.0:

 In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users'); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles'); } }

O CakePHP assume as convenções padrão e assim automaticamente sabe quais chaves estrangeiras procurar (ou seja, user_id na tabela de articles ) ao buscar qualquer associação.

É importante enfatizar, porém, que o CakePHP 3 permite que suas convenções padrão sejam facilmente substituídas. Por exemplo, digamos que nossa chave estrangeira na tabela users se chama author_id em vez de user_id . Especificar isso exigiria apenas as duas pequenas alterações a seguir em nosso código para informar ao CakePHP que não estamos usando o padrão:

 In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users' => ['foreignKey' => 'author_id']); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles' => ['foreignKey' => 'author_id']); } }

Portanto, embora as convenções sejam de fato parte integrante do CakePHP e definitivamente tenham suas vantagens, substituí-las quando necessário é realmente muito simples, como mostramos aqui.

Enquanto alguns desenvolvedores podem preferir frameworks PHP (como Yii e Laravel) que não dependem tanto de convenções, as convenções do CakePHP podem ser bastante vantajosas. Eles podem ajudar a reduzir drasticamente o tempo de aceleração para um desenvolvedor do CakePHP quando encarregado de aprimorar ou manter o código escrito por outro desenvolvedor, pois resultam em uma estrutura de codificação e convenções consistentes em vários desenvolvedores e projetos do CakePHP.

Mapeamento relacional de objetos (ORM) do CakePHP

O mapeamento objeto-relacional (ORM) do CakePHP se beneficia muito das convenções de framework do CakePHP. Ao definir o esquema do banco de dados para os padrões do Cake, você pode conectar rapidamente as tabelas através do poderoso ORM do Cake. Você raramente precisará escrever uma instrução SQL, pois o CakePHP lida com coisas como junções de tabelas, hasMany e até mesmo relacionamentos hasAndBelongsToMany com facilidade.

Aproveitando o ContainableBehavior do CakePHP, por meio de suas associações de modelo, você pode especificar quais tabelas e campos de banco de dados devem ser selecionados em uma consulta SQL. Isso pode abranger várias tabelas e, por meio do ORM, é fácil construir rapidamente instruções SQL altamente complexas.

Aliás, o ContainableBehavior do CakePHP é um ótimo exemplo de como o CakePHP pode simplificar e agilizar o desenvolvimento do PHP. Ele ajuda você a pesquisar e filtrar dados de maneira limpa e consistente e também pode ajudar a aumentar a velocidade e o desempenho geral do seu aplicativo. (Ele funciona alterando temporária ou permanentemente as associações de seus modelos, usando as contenção fornecidas para gerar uma série correspondente de chamadas de bindModel e unbindModel .)

O desafio com o ORM é que ele torna o uso do SQL tão simples que, se um desenvolvedor não for cuidadoso, ele poderá escrever consultas SQL ineficientes sem querer. Eu certamente já vi aplicações Cake mal escritas muitas vezes que não simplificaram suas consultas. Esses problemas tendem a surgir alguns anos após a implantação de um sistema, quando os bancos de dados ficam maiores e as consultas mal escritas se tornam cada vez mais lentas.

O principal problema aqui é que, antes da última versão 3 do CakePHP, o ORM do Cake, por padrão, recuperava todas as tabelas associadas ao realizar uma consulta. Como resultado, uma simples consulta “localizar tudo” poderia ficar bastante inchada, pois o SQL subjacente recuperaria todos os dados de todas as tabelas associadas. Na versão 3, esse comportamento não é mais o padrão. (E nas versões anteriores do CakePHP, esse comportamento padrão é fácil de desabilitar simplesmente adicionando public $recursive = -1; ao seu arquivo AppModel.php principal.)

No geral, uma análise do ORM do Cake mostra que ele realmente ajuda a agilizar o desenvolvimento e, se usado corretamente, é uma ferramenta incrível para criar consultas complexas rapidamente. No entanto, é vital que os desenvolvedores reservem um tempo para entender completamente o ORM e garantir que suas consultas sejam adequadamente otimizadas (como é verdade em qualquer idioma).

Componentes e auxiliares: Bibliotecas do CakePHP

Um dos grandes recursos do CakePHP são as bibliotecas internas – Componentes e Helpers – que eliminam muitas tarefas de desenvolvimento chatas, repetitivas e tediosas. No contexto do MVC, os Componentes ajudam a agilizar o desenvolvimento do controlador, enquanto os Auxiliares simplificam a codificação e a lógica da visualização (ou seja, a camada de apresentação).

O PaginatorComponent , por exemplo, cria automaticamente uma interface de página anterior/seguinte a partir de uma consulta de localização. Adicione o JsHelper e, de repente, você terá a paginação AJAX, alimentada por sua estrutura JavaScript favorita (jQuery por padrão).

Uma amostra rápida de outros Helpers úteis inclui:

  • TimeHelper : Facilita a exibição de datas e horas, fornecendo um conjunto de funções para formatar e avaliar valores de hora.
  • NumberHelper : Fornece métodos convenientes para exibir números em uma variedade de formatos e precisões comuns (ou personalizados).
  • TextHelper : Ajuda a habilitar links, formatar URLs, criar trechos de texto em torno de palavras ou frases escolhidas, destacar palavras-chave em blocos de texto e truncar longos trechos de texto.

E há muito mais.

Críticas ao CakePHP 3

Para ter certeza, todo framework tem seus prós e contras, e o CakePHP não é exceção. Aqui estão algumas das críticas mais comuns feitas ao CakePHP fora desta revisão:

  • “Quadro legado; inchado e lento.” Essa crítica é tipicamente mais histórica, com verdade limitada (se houver) hoje. O suporte a versões do PHP desde o PHP 4 exigia historicamente que o CakePHP lidasse com muitos dos problemas herdados do próprio PHP. Com o amadurecimento do PHP, e com o lançamento do CakePHP versão 3 em particular, essa alegação realmente perdeu sua validade.

  • “Excessivamente rigoroso e limitador.” Embora existam claras vantagens nas convenções do CakePHP, há quem as critique mesmo assim. Os críticos costumam argumentar que as convenções são muito rígidas, mas não reconhecem (ou reconhecem) que essas convenções podem ser facilmente substituídas. Ao adotar um conjunto padrão de convenções, o Cake procura tornar o desenvolvimento consistente, o que, dadas as práticas de codificação frouxas do PHP, deve ser visto apenas como algo positivo.

  • “Ciclo de liberação lenta”. Um ciclo de lançamento lento não é necessariamente ruim. Pelo contrário, um ciclo de lançamento muito agressivo pode ser mais problemático. Na verdade, parte do motivo pelo qual os principais lançamentos do CakePHP levam tempo é para garantir a compatibilidade com versões anteriores do PHP que ainda são amplamente implantadas. Além disso, esse ciclo de lançamento conservador e a ênfase na compatibilidade com versões anteriores eliminam a necessidade de alterações importantes (e frequentes) em seu código quando novas versões são lançadas. Deve-se notar também que a equipe do CakePHP 3 é tudo menos lenta quando se trata de lançamentos menores (correções de bugs, patches, pequenas melhorias, etc.), que são lançados mensalmente . Da mesma forma, a maioria dos tickets de bugs são respondidos poucas horas após serem postados.

  • “Não é uma solução pronta para uso.” Em contraste com muitos outros frameworks PHP “aplicativos da web prontos para uso” modernos (como Yii, por exemplo), o CakePHP procura propositadamente oferecer suporte e habilitar soluções personalizadas. Eu pessoalmente me beneficiei muito disso ao desenvolver vários sites e aplicativos grandes, personalizados e baseados em banco de dados.

  • “Usa matrizes de dados em vez de objetos.” Isso não é mais verdade, a partir da versão 3. Nas versões anteriores, qualquer dado precisaria ser armazenado e referenciado como arrays aninhados (por exemplo, $user['User']['username'] ). O CakePHP 3 finalmente resolve isso, ao invés de armazenar dados como objetos (por exemplo, $user->username ).

  • “Documentação ruim.” Há alguma validade nesta crítica, pois a documentação do CakePHP nem sempre parece ter sido escrita com o iniciante em mente (informações importantes são discutidas às vezes em apenas uma ou duas frases, enquanto alguns parágrafos de discussão provavelmente seriam justificados ). A equipe de desenvolvimento do Cake está ciente disso e está trabalhando para melhorar a documentação de acordo. De fato, a página inicial da documentação do CakePHP 3 declara explicitamente um alto nível de compromisso com a “qualidade, validade e precisão” da documentação. Como o CakePHP é uma estrutura orientada para a comunidade, um botão “Melhorar este documento” é fornecido em todas as páginas da documentação, permitindo e incentivando os usuários do CakePHP a contribuir com suas próprias adições, exclusões ou correções à documentação.

Conclusão

Ao todo, quase 10 anos após seu lançamento inicial, uma revisão do CakePHP revela que ele continua sendo um concorrente vibrante e formidável para muitos outros frameworks PHP que surgiram desde então.

CakePHP é uma solução de desenvolvimento completa e abrangente. A base de código é madura e a funcionalidade parece infinita. No geral, o Cake foi criado para tornar o desenvolvimento rápido, o que é importante não apenas para desenvolvedores de software, mas também para investidores. O maior custo do desenvolvimento de software é o custo do tempo de desenvolvimento, e o CakePHP visa reduzir significativamente o tempo de desenvolvimento.

CakePHP é um projeto executado pela comunidade. Só pode melhorar à medida que mais e mais pessoas se envolvem. Tendo estado envolvido por 7 anos e visto a comunidade continuar crescendo, estou empolgado com esta próxima etapa do CakePHP. O lançamento do CakePHP 3, e a maturidade do PHP e do CakePHP, significa que o framework continuará a ficar cada vez melhor.

Se você estiver procurando por uma solução baseada em PHP que ofereça muitos benefícios semelhantes ao Ruby on Rails (em termos de facilidade de uso e convenção sobre configuração), dê uma chance ao CakePHP. O Tutorial do Blog do CakePHP leva apenas alguns minutos para ser configurado e executado, ou, alternativamente, o CakeCoded oferece uma série de lições claras para ajudar a familiarizar um desenvolvedor PHP com o CakePHP e começar a usá-lo. Com esses recursos, você verá rapidamente até que ponto o CakePHP pode acelerar e aprimorar seus esforços de desenvolvimento de software PHP. Aproveitar!


Michael Houghton é um engenheiro da Toptal baseado na Irlanda com vasta experiência em CakePHP. Ele desenvolveu mais de 100 sites com o framework, trabalhou com a equipe do CakeDC (a entidade comercial por trás do framework CakePHP), submeteu vários patches e ajudou com a documentação do CakePHP.