{"id":231182,"date":"2022-12-14T16:49:00","date_gmt":"2022-12-14T13:49:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231182"},"modified":"2022-12-14T16:53:27","modified_gmt":"2022-12-14T13:53:27","slug":"widgets-do-wordpress-comecando-com-padroes","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/widgets-do-wordpress-comecando-com-padroes\/","title":{"rendered":"Widgets do WordPress: Come\u00e7ando com Padr\u00f5es"},"content":{"rendered":"\n<p>O objetivo desta s\u00e9rie \u00e9 come\u00e7ar a mergulhar mais fundo no trabalho com programa\u00e7\u00e3o orientada a objetos no contexto do WordPress.<\/p>\n<p>E como a API do WordPress Widgets \u00e9 uma das APIs que usa pr\u00e1ticas orientadas a objetos, \u00e9 um lugar l\u00f3gico para come\u00e7ar. Al\u00e9m disso, ele nos dar\u00e1 algumas t\u00e9cnicas fundamentais que podemos usar para aplicar em trabalhos futuros, pois veremos como construir mais projetos orientados a objetos no WordPress em s\u00e9ries futuras.<\/p>\n<p>At\u00e9 agora, cobrimos o seguinte:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/widgets-do-wordpress-uma-abordagem-orientada-a-objetos\/\" title=\"Widgets do WordPress: uma abordagem orientada a objetos\">Widgets do WordPress: uma abordagem orientada a objetos<\/a>. A API Widgets fornece um teste decisivo s\u00f3lido e um exemplo de como come\u00e7ar a programa\u00e7\u00e3o orientada a objetos no WordPress.<\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/widgets-do-wordpress-detectar-programacao-orientada-a-objetos\/\" title=\"Widgets do WordPress: Como detectar programa\u00e7\u00e3o orientada a objetos\">Widgets do WordPress: Como detectar programa\u00e7\u00e3o orientada a objetos<\/a>. O objetivo \u00e9 armar voc\u00ea com tudo que voc\u00ea precisa para detectar pr\u00e1ticas orientadas a objetos.<\/li>\n<\/ol>\n<p>Se voc\u00ea n\u00e3o est\u00e1 preso, agora \u00e9 um \u00f3timo momento para faz\u00ea-lo. E se voc\u00ea tiver, ent\u00e3o voc\u00ea vai se lembrar do \u00faltimo post, terminamos com a seguinte nota:<\/p>\n<blockquote>\n<p>Ou seja, vamos revisitar o <strong><a href=\"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress Widget Boilerplate<\/a><\/strong> e vou refator\u00e1-lo em seu estado atual para adotar padr\u00f5es PHP mais modernos.<\/p>\n<\/blockquote>\n<p>Para come\u00e7ar a atualizar o WordPress Widget Boilerplate para seguir esses padr\u00f5es, precisamos fazer algumas coisas:<\/p>\n<ol>\n<li>crie uma ramifica\u00e7\u00e3o a partir do clich\u00ea existente,<\/li>\n<li>instalar ferramentas de qualidade de c\u00f3digo,<\/li>\n<li>garantir que nosso IDE esteja configurado corretamente,<\/li>\n<li>e comece a refatorar o c\u00f3digo para esses padr\u00f5es.<\/li>\n<\/ol>\n<p>E \u00e9 isso que vamos come\u00e7ar a fazer com este post.<\/p>\n<h2>Come\u00e7ando com padr\u00f5es<\/h2>\n<p>Se voc\u00ea \u00e9 membro deste site h\u00e1 algum tempo, sabe que prefiro usar o Visual Studio Code. Se n\u00e3o, eu tenho <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/visual-studio-code\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">um conjunto inteiro de artigos<\/a><\/strong> dedicados a como eu o uso (e, portanto, como o usaremos ao longo desta s\u00e9rie de posts).<\/p>\n<p>E se voc\u00ea estiver interessado em cobertura sobre padr\u00f5es de codifica\u00e7\u00e3o, depura\u00e7\u00e3o, IDEs, ambientes de desenvolvimento e assim por diante, confira <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/the-independent-wordpress-developer\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">The Independent WordPress Developer<\/a><\/strong>.<\/p>\n<p>No entanto, estou assumindo que se voc\u00ea est\u00e1 lendo isso, ent\u00e3o voc\u00ea leu todo o material acima ou est\u00e1 confort\u00e1vel lendo todo o material acima.<\/p>\n<p>Dito isso, vamos come\u00e7ar.<\/p>\n<h3>Baixando o Reposit\u00f3rio<\/h3>\n<p>A primeira coisa que voc\u00ea vai querer fazer \u00e9 clonar uma c\u00f3pia do reposit\u00f3rio. Eu prefiro fazer isso atrav\u00e9s da linha de comando.<\/p>\n<p>Al\u00e9m disso, tamb\u00e9m acho que vale a pena fazer isso contra <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/desenvolvendo-plugins-e-temas-contra-o-wordpress-trunk\/\" title=\"a vers\u00e3o mais recente do WordPress\">a vers\u00e3o mais recente do WordPress<\/a><\/strong>. Se voc\u00ea n\u00e3o tem uma c\u00f3pia do tronco do WordPress do Subversion, voc\u00ea pode ler como configurar isso aqui; no entanto, isso \u00e9 puramente opcional. Voc\u00ea pode acompanhar o restante deste tutorial com qualquer vers\u00e3o do WordPress que desejar.<\/p>\n<p>Para faz\u00ea-lo,<\/p>\n<ol>\n<li>Verifique se voc\u00ea est\u00e1 no diret\u00f3rio de <strong>plugins<\/strong> da sua instala\u00e7\u00e3o do WordPress<\/li>\n<li>E, em seguida, digite os seguintes comandos em uma c\u00f3pia do seu terminal<\/li>\n<\/ol>\n<pre><code>$ <\/code><\/pre>\n<p>Isso criar\u00e1 um\u00a0 diret\u00f3rio <strong>WordPress-Widget-Boilerplate<\/strong> em seu\u00a0 diret\u00f3rio de <strong>plugins<\/strong>. Voc\u00ea pode navegar at\u00e9 ele digitando simples:<\/p>\n<pre><code>$ cd WordPress-Widget-Boilerplate<\/code><\/pre>\n<p>Os resultados da clonagem do reposit\u00f3rio devem ser parecidos com isto:<\/p>\n<p>Em seguida, voc\u00ea precisa ter certeza de mudar para o\u00a0 branch de <strong>desenvolvimento<\/strong> que eu criei. \u00c9 muito f\u00e1cil fazer isso. Mas antes de fazermos isso, por que n\u00e3o configurar o projeto no Visual Studio?<\/p>\n<h3>Configurando o c\u00f3digo do Visual Studio<\/h3>\n<p>As etapas para configurar o projeto no Visual Studio Code s\u00e3o simples:<\/p>\n<ol>\n<li>Arraste o diret\u00f3rio do Boilerplate para o IDE,<\/li>\n<li>Abra o terminal integrado,<\/li>\n<li>Trocar filiais<\/li>\n<\/ol>\n<p>Assim como fiz acima, fornecerei um screencast sobre como fazer tudo isso. Arrastar um diret\u00f3rio para o Visual Studio Code deve ser bastante f\u00e1cil, mas trocar ramifica\u00e7\u00f5es na linha de comando pode ser um pouco diferente.<\/p>\n<p>Primeiro, configurando o projeto no Visual Studio Code:<\/p>\n<\/p>\n<p>Observe aqui que tamb\u00e9m abro o terminal integrado pressionando o atalho CMD + P (estou no macOS, portanto, seu atalho pode ser diferente). Ent\u00e3o eu insiro o comando para verificar a ramifica\u00e7\u00e3o de <strong>desenvolvimento .<\/strong><\/p>\n<p>Depois de fazer isso, seu reposit\u00f3rio local deve mudar para o branch de desenvolvimento. Voc\u00ea pode confirmar que \u00e9 o branch do qual voc\u00ea est\u00e1 trabalhando digitando:<\/p>\n<pre><code>$ git branch<\/code><\/pre>\n<p>E, em seguida, revise o conte\u00fado do terminal. A rigor,\u00a0 o <strong>desenvolvimento<\/strong> deve ser destacado.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e7262e24cf5.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e7262e24cf5.png\" alt=\"Widgets do WordPress: Come\u00e7ando com Padr\u00f5es\"><\/a><\/p>\n<p>Neste ponto, vamos introduzir alguns novos arquivos no projeto. No final deste tutorial, voc\u00ea pode formar um <strong>pull<\/strong> para obter tudo o que estou prestes a documentar aqui. Mas como o objetivo do que estamos fazendo \u00e9 duplo, \u00e9 importante ter certeza de que estamos fazendo isso na sequ\u00eancia correta, porque o primeiro passo \u00e9 algo que eu uso em todos os projetos para WordPress neste momento.<\/p>\n<p>Ent\u00e3o, com isso dito, vamos dar uma olhada.<\/p>\n<h3>Compositor e qualidade do c\u00f3digo<\/h3>\n<p>A primeira coisa que gosto de fazer \u00e9 configurar uma s\u00e9rie de ferramentas para refor\u00e7ar a qualidade do c\u00f3digo. Isso \u00e9 alcan\u00e7ado por uma variedade de pacotes do Composer. Esses incluem:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/phpro\/grumphp\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">GrumPHP<\/a>. Uma ferramenta de qualidade de c\u00f3digo PHP. N\u00e3o subestime o esclarecimento e o grau em que este reposit\u00f3rio est\u00e1 cheio de informa\u00e7\u00f5es. Se voc\u00ea ficar preso a qualquer uma das outras ferramentas mencionadas aqui, consulte primeiro a documenta\u00e7\u00e3o deste reposit\u00f3rio.<\/li>\n<li><a href=\"https:\/\/github.com\/FriendsOfPHP\/PHP-CS-Fixer\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Fixador PHP CS<\/a>. Uma ferramenta para corrigir automaticamente problemas de padr\u00f5es de codifica\u00e7\u00e3o PHP.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/JakubOnderka\/PHP-Parallel-Lint\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP Paralelo Lint<\/a><\/strong>. Esta ferramenta verifica a sintaxe de arquivos PHP mais r\u00e1pido do que a verifica\u00e7\u00e3o serial com uma sa\u00edda mais sofisticada.<\/li>\n<li><a href=\"https:\/\/phpmd.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPMD<\/a>. Este utilit\u00e1rio pega uma determinada base de c\u00f3digo fonte PHP e procura v\u00e1rios problemas potenciais dentro dessa fonte<\/li>\n<li><a href=\"https:\/\/github.com\/nikic\/PHP-Parser\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Analisador PHP<\/a>. Um analisador \u00e9 \u00fatil para <a href=\"https:\/\/en.wikipedia.org\/wiki\/Static_program_analysis\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">an\u00e1lise est\u00e1tica<\/a>, manipula\u00e7\u00e3o de c\u00f3digo e, basicamente, qualquer outro aplicativo que lide com c\u00f3digo programaticamente.<\/li>\n<li><a href=\"https:\/\/github.com\/Ocramius\/ProxyManager\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Gerenciador de proxy<\/a>. Esta biblioteca tem como objetivo fornecer uma abstra\u00e7\u00e3o para gera\u00e7\u00e3o de v\u00e1rios tipos de classes proxy.<\/li>\n<\/ul>\n<p>Quero deixar duas coisas claras:<\/p>\n<ol>\n<li>As ferramentas acima s\u00e3o o m\u00ednimo que eu uso, e voc\u00ea provavelmente me ver\u00e1 usando ferramentas adicionais no futuro,<\/li>\n<li>as ferramentas acima ajudar\u00e3o a impor regras de qualidade de c\u00f3digo antes de verificar o c\u00f3digo em um reposit\u00f3rio. Destina-se a complementar a configura\u00e7\u00e3o em seu IDE.<\/li>\n<\/ol>\n<p>Para configurar e executar essas ferramentas no projeto, precisaremos criar um arquivo <strong>composer.json<\/strong> <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-00-composer-json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">parecido com este<\/a><\/strong> :<\/p>\n<pre><code>{\n    \"name\": \"wordpress-widget-boilerplate\/wordpress-widget-boilerplate\",\n    \"description\": \"An organized, maintainable boilerplate for building widgets using WordPress best practices.\",\n    \"type\": \"wordpress-plugin\",\n    \"license\": \"GPL-3.0-or-later\",\n    \"homepage\": \"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\",\n    \"authors\": [\n      {\n        \"name\": \"Tom McFarlin\",\n        \"email\": \"tom@pressware.co\",\n        \"homepage\": \"https:\/\/pressware.co\"\n      }\n    ],\n    \"support\": {\n      \"issues\": \"https:\/\/github.com\/tommcfarlin\/WordPress-Widget-Boilerplate\/issues\"\n    },\n    \"config\": {\n      \"preferred-install\": \"dist\",\n      \"platform\": {\n          \"php\": \"7.1\"\n      }\n    },\n    \"repositories\": [\n      {\n        \"type\": \"composer\",\n        \"url\": \"https:\/\/wpackagist.org\"\n      }\n    ],\n    \"require\": {\n      \"php\": \"7.1\",\n      \"composer\/installers\": \"^1.4\"\n    },\n    \"require-dev\": {\n        \"friendsofphp\/php-cs-fixer\": \"^2.13.1\",\n        \"jakub-onderka\/php-parallel-lint\": \"^1.0.0\",\n        \"phpmd\/phpmd\": \"^v2.6.0\",\n        \"nikic\/php-parser\": \"^4.0\",\n        \"ocramius\/proxy-manager\": \"^2.0.0\",\n        \"phpro\/grumphp\": \"^0.13.1\"\n    },\n    \"scripts\": {\n      \"test\": [\n        \".\/vendor\/bin\/grumphp run\"\n      ]\n    },\n    \"minimum-stability\": \"stable\"\n  }<\/code><\/pre>\n<p>Lembre-se, voc\u00ea pode puxar isso manualmente no final deste post. Se, no entanto, voc\u00ea quiser acompanhar, sinta-se \u00e0 vontade para fazer isso manualmente. Eu nunca iria querer desencoraj\u00e1-lo disso. \ud83d\ude42<\/p>\n<p>Depois de criar o\u00a0 arquivo <strong>composer.json<\/strong>, certifique-se de executar o seguinte comando no terminal:<\/p>\n<pre><code>$ composer install<\/code><\/pre>\n<p>Isto pode tomar algum tempo; no entanto, uma vez feito, voc\u00ea deve receber a seguinte mensagem:<\/p>\n<blockquote>\n<p>Aten\u00e7\u00e3o! GrumPHP est\u00e1 farejando seus commits!<\/p>\n<\/blockquote>\n<p>Para fazer uma simula\u00e7\u00e3o, digite o seguinte comando no seu terminal:<\/p>\n<pre><code>$ vendor\/bin\/grumphp run<\/code><\/pre>\n<p>Dependendo de como voc\u00ea est\u00e1 trabalhando com o projeto, voc\u00ea pode ver uma sa\u00edda parecida com esta:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e72631d3f32.gif\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e72631d3f32.gif\" alt=\"Widgets do WordPress: Come\u00e7ando com Padr\u00f5es\"><\/a><\/p>\n<p>Mas h\u00e1 mais trabalho a fazer. Ou seja, precisamos:<\/p>\n<ul>\n<li>atualize nosso arquivo <strong>.gitignore ,<\/strong><\/li>\n<li>introduzir configura\u00e7\u00e3o para GrumPHP<\/li>\n<li>introduzir configura\u00e7\u00e3o para PHPMD,<\/li>\n<li>introduzir configura\u00e7\u00e3o para PHPCS,<\/li>\n<li>eventualmente, reestruture a estrutura de diret\u00f3rios do clich\u00ea.<\/li>\n<\/ul>\n<p>Tudo at\u00e9 a etapa final, vamos tentar fazer neste post.<\/p>\n<h3>Atualizando o arquivo Ignorar<\/h3>\n<p>Primeiro, n\u00e3o queremos confirmar o diret\u00f3rio do fornecedor ou o arquivo de bloqueio do compositor. Eles podem ser gerados sempre que um usu\u00e1rio baixa o diret\u00f3rio. Eles podem facilmente ficar fora de sincronia e adicionar um tamanho enorme ao diret\u00f3rio do projeto.<\/p>\n<p>Para esse fim, seu arquivo <strong>gitignore<\/strong> deve ficar <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-01-gitignore-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a><\/strong> :<\/p>\n<pre><code>*.DS_Store\n*.log\nwp-config.php\nwp-content\/advanced-cache.php\nwp-content\/backup-db\/\nwp-content\/backups\/\nwp-content\/blogs.dir\/\nwp-content\/cache\/\nwp-content\/upgrade\/\nwp-content\/uploads\/\nwp-content\/mu-plugins\/\nwp-content\/wp-cache-config.php\nwp-content\/plugins\/hello.php\n\n\/.htaccess\n\/license.txt\n\/readme.html\n\/sitemap.xml\n\/sitemap.xml.gz\n\nvendor\/\ncomposer.lock<\/code><\/pre>\n<p>Isso diz ao plugin para ignorar qualquer coisa, exceto o que est\u00e1 na raiz do diret\u00f3rio do plugin (e alguns dos eventuais diret\u00f3rios que criaremos) junto com alguns arquivos b\u00e1sicos que estamos acostumados a ver nas instala\u00e7\u00f5es do WordPress.<\/p>\n<p>Algumas das coisas que voc\u00ea v\u00ea, como <strong>wp-config.php<\/strong> ou <strong>wp-content\/backups<\/strong>, voc\u00ea provavelmente nunca ver\u00e1 no contexto de um plugin, mas essas s\u00e3o diretivas padr\u00e3o para ignorar o WordPress que eu gosto de manter \u00e0 m\u00e3o.<\/p>\n<p>Voc\u00ea notar\u00e1 que tamb\u00e9m adicionei\u00a0 o arquivo de bloqueio do <strong>fornecedor\u00a0<\/strong> e do compositor na parte inferior do arquivo.<\/p>\n<h3>Configurar GrumPHP<\/h3>\n<p>GrumPHP pode fazer muito, e se voc\u00ea gastou algum tempo examinando o reposit\u00f3rio antes de ler at\u00e9 aqui, ent\u00e3o voc\u00ea provavelmente sabe disso; no entanto, vou mant\u00ea-lo o mais enxuto poss\u00edvel, para que ele forne\u00e7a as instru\u00e7\u00f5es necess\u00e1rias para as ferramentas que estamos usando <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-02-grumphp-yml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">e nada mais<\/a><\/strong>.<\/p>\n<pre><code>parameters:\n    git_dir: .git\n    bin_dir: vendor\/bin\n    process_timeout: 120\n    tasks:\n      securitychecker:\n      composer:\n      jsonlint:\n      xmllint:\n      yamllint:\n      phplint:\n        exclude:\n          - vendor\/\n      phpcs:\n        metadata:\n          priority: 200\n      phpcsfixer2:\n        allow_risky: true\n        config: '.php_cs.dist'\n        metadata:\n          priority: 300\n      phpparser:\n        visitors:\n          forbidden_function_calls:\n            blacklist:\n              - \"exit\"\n              - \"var_dump\"\n      phpversion:\n        project: '7.1'\n      phpmd:\n        exclude: ['vendor']\n        ruleset: ['phpmd.xml']<\/code><\/pre>\n<p>Em suma, isso diz para executar uma variedade de verifica\u00e7\u00f5es para:<\/p>\n<ul>\n<li>seguran\u00e7a,<\/li>\n<li>compositor,<\/li>\n<li>JSON,<\/li>\n<li>XML,<\/li>\n<li>Yaml,<\/li>\n<li>PHP,<\/li>\n<li>PHPCS,<\/li>\n<li>Analisador PHP,<\/li>\n<li>PHPMD,<\/li>\n<li>e mais.<\/li>\n<\/ul>\n<p>Assim que terminarmos de configurar todo o resto, mostrarei como tudo isso se encaixa. Mas primeiro, vamos terminar de configurar o restante de nossos utilit\u00e1rios.<\/p>\n<h3>PHPCS<\/h3>\n<p>Isso usa dois arquivos separados \u2013 um\u00a0 arquivo <strong>dist<\/strong> e um\u00a0 arquivo <strong>XML<\/strong> \u2013 cada um dos quais serve a prop\u00f3sitos diferentes, embora muito \u00fateis.<\/p>\n<p>O primeiro arquivo, <strong>php_cs.dist<\/strong>, que voc\u00ea ver\u00e1 no reposit\u00f3rio no final deste post, fornece um cabe\u00e7alho que \u00e9 aplicado a todos os arquivos PHP em nosso projeto. Ele tamb\u00e9m imp\u00f5e algumas regras diferentes que melhoram a qualidade do c\u00f3digo.<\/p>\n<p>As regras s\u00e3o auto-explicativas e voc\u00ea pode ver o que ser\u00e1 aplicado simplesmente examinando cada uma das regras <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-03-phpcs-dist\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">definidas<\/a><\/strong>.<\/p>\n<pre><code>&lt;?php\n\n$header = &lt;&lt;&lt;'EOF'\nThis file is part of the WordPress Widget Boilerplate\n(c) Tom McFarlin &lt;tom@tommcfarlin.com&gt;\n\nThis source file is subject to the GPL license that is bundled\nwith this source code in the file LICENSE.\nEOF;\n\nreturn PhpCsFixerConfig::create()\n  -&gt;setRiskyAllowed(true)\n  -&gt;setRules([\n    '@PHP56Migration' =&gt; true,\n    '@Symfony' =&gt; true,\n    '@Symfony:risky' =&gt; true,\n    'align_multiline_comment' =&gt; true,\n    'array_syntax' =&gt; ['syntax' =&gt; 'short'],\n    'blank_line_before_statement' =&gt; true,\n    'combine_consecutive_issets' =&gt; true,\n    'combine_consecutive_unsets' =&gt; true,\n    \/\/ one should use PHPUnit methods to set up expected exception instead of annotations\n    'general_phpdoc_annotation_remove' =&gt; ['annotations' =&gt; ['expectedException', 'expectedExceptionMessage', 'expectedExceptionMessageRegExp']],\n    'header_comment' =&gt; ['header' =&gt; $header],\n    'heredoc_to_nowdoc' =&gt; true,\n    'list_syntax' =&gt; ['syntax' =&gt; 'long'],\n    'method_argument_space' =&gt; ['ensure_fully_multiline' =&gt; true],\n    'method_chaining_indentation' =&gt; false,\n    'no_extra_consecutive_blank_lines' =&gt; ['tokens' =&gt; ['break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block']],\n    'no_null_property_initialization' =&gt; true,\n    'no_short_echo_tag' =&gt; true,\n    'no_unneeded_curly_braces' =&gt; true,\n    'no_unneeded_final_method' =&gt; true,\n    'no_unreachable_default_argument_value' =&gt; true,\n    'no_useless_else' =&gt; true,\n    'no_useless_return' =&gt; true,\n    'ordered_class_elements' =&gt; true,\n    'ordered_imports' =&gt; true,\n    'php_unit_construct' =&gt; true,\n    'php_unit_test_class_requires_covers' =&gt; true,\n    'php_unit_dedicate_assert' =&gt; true,\n    'phpdoc_add_missing_param_annotation' =&gt; true,\n    'phpdoc_order' =&gt; true,\n    'phpdoc_types_order' =&gt; ['null_adjustment' =&gt; 'always_last'],\n    'semicolon_after_instruction' =&gt; true,\n    'single_line_comment_style' =&gt; true,\n    'visibility_required' =&gt; ['const', 'property', 'method'],\n    'yoda_style' =&gt; true,\n  ])\n  -&gt;setFinder(\n    PhpCsFixerFinder::create()\n      -&gt;exclude(__DIR__. '\/vendor\/*')\n      -&gt;in([\n        __DIR__. '\/src'\n      ])) ;<\/code><\/pre>\n<p>Em seguida, voc\u00ea tamb\u00e9m desejar\u00e1 criar o arquivo XML para complementar o arquivo acima. Voc\u00ea notar\u00e1 que no arquivo que estou fornecendo, isso \u00e9 o que uso para meu trabalho na <strong><a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pressware<\/a><\/strong>. Al\u00e9m disso, tamb\u00e9m reconhece o\u00a0 diret\u00f3rio de <strong>testes<\/strong>.<\/p>\n<p>Neste ponto, n\u00e3o temos nenhum teste de unidade escrito, mas se voc\u00ea optar por introduzi-lo em seu widget, ele estar\u00e1 pronto para trat\u00e1-lo adequadamente.<\/p>\n<pre><code>&lt;?xml version=\"1.0\"?&gt;\n&lt;ruleset name=\"Pressware\"&gt;\n    &lt;description&gt;Pressware, LLC Coding Standards&lt;\/description&gt;\n\n    &lt;!-- Scan all files in directory --&gt;\n    &lt;file&gt;.\/src&lt;\/file&gt;\n    &lt;file&gt;.\/tests&lt;\/file&gt;\n    &lt;exclude-pattern&gt;.\/tests\/phpunit\/*&lt;\/exclude-pattern&gt;\n    &lt;!-- Scan only PHP files --&gt;\n    &lt;arg name=\"extensions\" value=\"php\"&gt;&lt;\/arg&gt;\n\n    &lt;!-- Show colors in console --&gt;\n    &lt;arg value=\"-colors\"&gt;&lt;\/arg&gt;\n\n    &lt;!-- Show sniff codes in all reports --&gt;\n    &lt;arg value=\"ns\"&gt;&lt;\/arg&gt;\n\n    &lt;!-- Use PSR-2 as a base --&gt;\n    &lt;rule ref=\"PSR2\"&gt;&lt;\/rule&gt;\n    &lt;rule ref=\"Generic.Arrays.DisallowLongArraySyntax.Found\" &gt;&lt;\/rule&gt;\n\n    &lt;!-- Force 2 spaces indentation --&gt;\n    &lt;rule ref=\"Generic.WhiteSpace.ScopeIndent\"&gt;\n        &lt;properties&gt;\n            &lt;property name=\"indent\" value=\"4\"&gt;&lt;\/property&gt;\n            &lt;property name=\"tabIndent\" value=\"false\"&gt;&lt;\/property&gt;\n        &lt;\/properties&gt;\n    &lt;\/rule&gt;\n&lt;\/ruleset&gt;<\/code><\/pre>\n<p>H\u00e1 apenas um pequeno conjunto de configura\u00e7\u00e3o que eu especifico aqui, mas achei que \u00e9 mais do que suficiente para minhas necessidades at\u00e9 agora. Conforme eu descobrir mais ou optar por usar mais, certamente atualizarei o conte\u00fado nos pr\u00f3ximos posts.<\/p>\n<h3>Configurar PHPMD<\/h3>\n<p>E, finalmente, precisamos configurar o PHP Mess Detector (ou PHPMD). Felizmente, isso usa um arquivo XML que usar\u00e1 conjuntos de regras conforme definido no pacote instalado pelo Composer. Tudo o que precisamos fazer \u00e9 referenciar a regra no arquivo de configura\u00e7\u00e3o.<\/p>\n<p>Em segundo lugar, tamb\u00e9m forneceremos uma pequena exclus\u00e3o para um\u00a0 nome <strong>ShortVariable<\/strong>, como voc\u00ea ver\u00e1 na <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/c75e37f2ca15035013477c77ac3a18a6#file-05-phpmd-xml\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seguinte ess\u00eancia<\/a><\/strong> :<\/p>\n<pre><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?&gt;\n&lt;ruleset\n    name=\"VersionEyeModule rules\"\n    xmlns=\"http:\/\/pmd.sf.net\/ruleset\/1.0.0\"\n    xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n    xsi:schemaLocation=\"http:\/\/pmd.sf.net\/ruleset\/1.0.0 http:\/\/pmd.sf.net\/ruleset_xml_schema.xsd\"\n    xsi:noNamespaceSchemaLocation=\"http:\/\/pmd.sf.net\/ruleset_xml_schema.xsd\"\n&gt;\n    &lt;rule ref=\"rulesets\/cleancode.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/codesize.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/controversial.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/design.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/unusedcode.xml\" &gt;&lt;\/rule&gt;\n    &lt;rule ref=\"rulesets\/naming.xml\"&gt;\n        &lt;exclude name=\"ShortVariable\"&gt;&lt;\/exclude&gt;\n    &lt;\/rule&gt;\n\n    &lt;rule ref=\"rulesets\/naming.xml\/ShortVariable\"\n          since=\"0.2\"\n          message=\"Avoid variables with short names like {0}. Configured minimum length is {1}.\"\n          class=\"PHPMDRuleNamingShortVariable\"\n          externalInfoUrl=\"http:\/\/phpmd.org\/rules\/naming.html#shortvariable\"&gt;\n        &lt;priority&gt;3&lt;\/priority&gt;\n        &lt;properties&gt;\n            &lt;property name=\"minimum\" description=\"Minimum length for a variable, property or parameter name\" value=\"3\"&gt;&lt;\/property&gt;\n            &lt;property name=\"exceptions\" value=\"id,q,w,i,j,v,e,f,fp\" &gt;&lt;\/property&gt;\n        &lt;\/properties&gt;\n    &lt;\/rule&gt;\n&lt;\/ruleset&gt;<\/code><\/pre>\n<p>E uma vez que tudo isso esteja no lugar, devemos ser capazes de executar o GrumPHP novamente, a partir da linha de comando, e ter um conjunto de resultados ligeiramente diferente.<\/p>\n<h3>Executando GrumPHP novamente<\/h3>\n<p>Digite o seguinte no seu terminal:<\/p>\n<pre><code>$ vendor\/bin\/grumphp run<\/code><\/pre>\n<p>E voc\u00ea deve ver algo assim:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e726340729e.gif\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161604-61e726340729e.gif\" alt=\"Widgets do WordPress: Come\u00e7ando com Padr\u00f5es\"><\/a><\/p>\n<p>Resultados diferentes da primeira vez, n\u00e9? Isso ocorre porque estamos violando algumas regras e padr\u00f5es que s\u00e3o uma parte moderna do PHP e do desenvolvimento orientado a objetos.<\/p>\n<p>E \u00e9 isso que vamos esclarecer no pr\u00f3ximo post.<\/p>\n<h2>Chegando<\/h2>\n<p>Ent\u00e3o, de onde vem a natureza orientada a objetos disso? At\u00e9 este ponto, falamos sobre o uso da API Widgets como um modelo orientado a objetos para escrever c\u00f3digo orientado a objetos no WordPress.<\/p>\n<p>Parte do que fizemos at\u00e9 agora foi exatamente isso (conversando sobre seus princ\u00edpios, vendo como est\u00e1 organizado e muito mais).<\/p>\n<p>Mas, como mencionei no in\u00edcio deste post, colocar ferramentas de qualidade de c\u00f3digo primeiro nos fornece uma base que podemos usar \u00e0 medida que refatoramos o clich\u00ea (o que claramente precisamos fazer, dada a quantidade de vermelho mostrada pelo GrumPHP).<\/p>\n<p>E \u00e9 por a\u00ed que vamos come\u00e7ar no pr\u00f3ximo post desta s\u00e9rie.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma das melhores maneiras de fazer programa\u00e7\u00e3o orientada a objetos \u00e9 come\u00e7ar com padr\u00f5es e ter ferramentas para aplic\u00e1-los.<\/p>\n","protected":false},"author":1,"featured_media":235870,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,867],"tags":[1170],"class_list":["post-231182","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231182","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=231182"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231182\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/235870"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231182"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231182"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231182"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}