Por que vale a pena fuçar no código alheio?
\nLembra daquela sensação quando você escreveu um script que até funciona, mas parece que poderia ter sido feito de forma mais simples e elegante? Ou quando você olha para o seu código um mês depois e não entende o que está acontecendo? Bem-vindo ao clube. A boa notícia é que você não precisa reinventar a roda. A comunidade PHP no GitHub é uma mina de ouro de soluções prontas, padrões arquiteturais e simplesmente linhas de código bonitas.
\nNeste artigo, não vamos apenas listar links. Vamos mostrar a você como ler código alheio e o que exatamente procurar em cada um desses repositórios. Aperte os cintos, vai ser interessante.
\n\n1. Laravel: Elegância e "magia" sob o capô
\nVamos começar com o rei. O repositório laravel/framework não é apenas um framework, é um manual de OOP avançado em PHP. Se você quer entender como funcionam o Service Container, Facades ou Eloquent, é aqui que você deve estar.
O que olhar primeiro:
\n- \n
- Pasta
src/Illuminate/Support— coleções de helpers. Preste atenção nos traitsMacroableeTappable. É a mágica que torna o código legível. \n - Arquivos de roteamento (
Router.php) — entenda como uma requisição se transforma em resposta. \n - Método
__call()e métodos mágicos — o Laravel os usa ativamente. Veja como as Facades são implementadas. \n
<?php\n// Exemplo do trait Macroable\npublic static function macro($name, $macro)\n{\n static::$macros[$name] = $macro;\n}\n\npublic function __call($method, $parameters)\n{\n if (isset(static::$macros[$method])) {\n return call_user_func_array(static::$macros[$method]->bindTo($this, static::class), $parameters);\n }\n throw new BadMethodCallException("Method {$method} does not exist.");\n}\n?>\nDica: Não tente ler tudo de uma vez. Comece com um componente (por exemplo, Http ou Database) e veja como ele é testado. Os testes no Laravel são uma forma de arte à parte.
2. Symfony: A arquitetura que sustenta tudo
\nSe o Laravel é um carro de corrida, o symfony/symfony é uma linha de montagem de fábrica. Modularidade, Dependency Injection, Event Dispatcher. Este repositório vai te ensinar a escrever código que não quebra daqui a um ano.
Pontos de entrada principais:
\n- \n
- Componente
HttpKernel— o sistema nervoso do framework. Veja como funcionam os middlewares e o tratamento de exceções. \n - Componente
DependencyInjection— entenda como o contêiner gerencia as dependências. Isso vai mudar sua abordagem de design. \n - Componente
Console— se você escreve comandos de console, veja como é feito no Symfony. Tem truques com perguntas e barra de progresso. \n
<?php\n// Exemplo do componente Console: saída simples com progresso\nuse Symfony\\Component\\Console\\Helper\\ProgressBar;\n\n$progressBar = new ProgressBar($output, 50);\n$progressBar->start();\n\nfor ($i = 0; $i < 50; $i++) {\n // ... fazendo algo ...\n usleep(100000);\n $progressBar->advance();\n}\n\n$progressBar->finish();\n?>\nDica: Ignore a "magia". No Symfony não existe magia. Tudo é explícito e documentado. Procure arquivos com o sufixo Interface.php — são os contratos que ligam tudo.
3. Composer: O gerenciador de dependências que você usa todo dia
\nO repositório composer/composer é um exemplo de como escrever utilitários de linha de comando. Não é sobre web, é sobre engenharia.
O que aprender:
\n- \n
- Parsing e resolução de dependências — um algoritmo complexo implementado na classe
Solver. Veja