{"id":232137,"date":"2023-01-08T09:44:00","date_gmt":"2023-01-08T06:44:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232137"},"modified":"2023-01-08T09:45:45","modified_gmt":"2023-01-08T06:45:45","slug":"usando-um-registro-assinantes-e-servicos-no-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/usando-um-registro-assinantes-e-servicos-no-wordpress\/","title":{"rendered":"Usando um Registro, Assinantes e Servi\u00e7os no WordPress"},"content":{"rendered":"\n<p><strong>TL; DR:<\/strong> Acho o uso de um registro, assinantes e servi\u00e7os muito \u00fatil ao criar plugins e utilit\u00e1rios centrados em back-end para WordPress. Este post mostra como fazer isso.<\/p>\n<hr \/>\n<p>Depois de trabalhar com padr\u00f5es de design, programa\u00e7\u00e3o orientada a objetos e WordPress por anos, maneiras comuns de resolver problemas devem surgir.<\/p>\n<p>Foi assim que conseguimos padr\u00f5es de design orientados a objetos para come\u00e7ar, ent\u00e3o talvez essa seja uma varia\u00e7\u00e3o centrada no WordPress disso.<\/p>\n<p>Embora eu tenha escrito sobre coisas como registros em artigos anteriores (e at\u00e9 mesmo aqueles que <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/usando-o-padrao-de-registro-no-wordpress\/\" title=\"n\u00e3o s\u00e3o t\u00e3o antigos\">n\u00e3o s\u00e3o t\u00e3o antigos<\/a> ), nunca \u00e9 uma m\u00e1 ideia revisitar o mesmo t\u00f3pico, especialmente quando h\u00e1 algo a acrescentar ao take anterior.<\/p>\n<h2>Um Registro, Assinantes e Servi\u00e7os<\/h2>\n<p>Tudo descrito abaixo deve ser entendido dentro do contexto do plugin WordPress. Ou seja, isso n\u00e3o deve ser lido como uma maneira de trabalhar com outras estruturas, linguagens, aplicativos ou ao us\u00e1-lo com outros padr\u00f5es.<\/p>\n<p>Lembre-se disso ao ler isso.<\/p>\n<hr \/>\n<p>De qualquer forma, a ideia geral por tr\u00e1s da combina\u00e7\u00e3o desses tipos de objetos \u00e9 a seguinte:<\/p>\n<ol>\n<li>O registro lida com todos os assinantes,<\/li>\n<li>Os assinantes escutam ganchos dentro do WordPress (os que existem ou at\u00e9 mesmo ganchos personalizados),<\/li>\n<li>Os servi\u00e7os fazem o trabalho real sempre que o assinante os despacha.<\/li>\n<\/ol>\n<p>O objetivo \u00e9 que haja um \u00fanico local para registrar as classes respons\u00e1veis \u200b\u200bpelo despacho do trabalho. \u00c9 isso.<\/p>\n<p>Al\u00e9m disso, isso tamb\u00e9m facilita manter as coisas separadas para que, se voc\u00ea quiser testar seus servi\u00e7os isoladamente, seja muito mais f\u00e1cil porque eles n\u00e3o est\u00e3o necessariamente acoplados ao WordPress. E se forem, voc\u00ea pode simular os dados que precisam ser passados \u200b\u200bpara uma determinada fun\u00e7\u00e3o e avaliar o resultado.<\/p>\n<p>Este n\u00e3o \u00e9 um artigo sobre testes, portanto, voltemos \u00e0s classes reais.<\/p>\n<h3>Registro<\/h3>\n<p>Por defini\u00e7\u00e3o, o objetivo de um registro \u00e9 acompanhar as coisas. Quando se trata de implementar esse padr\u00e3o no WordPress, a ideia \u00e9 que o registro possa acompanhar os assinantes (que definirei mais adiante neste artigo).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dacccb19c.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-158242-61e6dacccb19c.png\" alt=\"Usando um Registro, Assinantes e Servi\u00e7os no WordPress\"><\/a><\/p>\n<p>Foto de <a href=\"https:\/\/unsplash.com\/@redaquamedia?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Denny M\u00fcller<\/a> no <a href=\"https:\/\/unsplash.com\/s\/photos\/register?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Al\u00e9m disso, a ideia \u00e9 que, quando chegar a hora, o que provavelmente ser\u00e1 diferente, independentemente da estrutura do seu plug-in, todos os assinantes ser\u00e3o instanciados. At\u00e9 esse ponto, por\u00e9m, voc\u00ea provavelmente vai querer fazer isso no in\u00edcio do ciclo de vida do WordPress.<\/p>\n<p>Dito isto, aqui est\u00e1 um exemplo de como o c\u00f3digo para registrar os assinantes:<\/p>\n<pre><code>private $subscribers = [\n    AssetSubscriber::class,\n    \/\/ ...\n    DeletedUserSubscriber::class,\n];<\/code><\/pre>\n<p>Em seguida, aqui est\u00e1 uma fun\u00e7\u00e3o para instanciar os assinantes.<\/p>\n<pre><code>public function run()\n{\n    array_map(\n        function ($subscriber) {\n            (new $subscriber())-&gt;subscribe();\n        },\n        $this-&gt;subscribers\n    );\n}<\/code><\/pre>\n<p>Esses blocos podem fazer parte da mesma fun\u00e7\u00e3o ou podem ser separados dependendo de suas necessidades.<\/p>\n<h3>Assinantes<\/h3>\n<p>Como mencionado, os assinantes s\u00e3o o caminho para:<\/p>\n<ol>\n<li>Ou\u00e7a um certo gancho no WordPress<\/li>\n<li>Despache um servi\u00e7o para fazer qualquer trabalho destinado ao gancho fornecido.<\/li>\n<\/ol>\n<p>Portanto, suponha por um momento que voc\u00ea queira fazer algo sempre que um usu\u00e1rio for exclu\u00eddo. Voc\u00ea deseja instanciar um servi\u00e7o por meio do assinante sempre que esse gancho acontecer.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dad44a26f.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-158242-61e6dad44a26f.png\" alt=\"Usando um Registro, Assinantes e Servi\u00e7os no WordPress\"><\/a><\/p>\n<p>Foto de <a href=\"https:\/\/unsplash.com\/@leecampbell?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Lee Campbell<\/a> no <a href=\"https:\/\/unsplash.com\/s\/photos\/headphones?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Como um exemplo:<\/p>\n<pre><code>class DeletedUserSubscriber\n{\n    public function subscribe()\n    {\n        (new DeletedUserService())-&gt;add('delete_user');\n    }\n}<\/code><\/pre>\n<p>Observe que o assinante est\u00e1 ciente do servi\u00e7o (embora n\u00e3o mantenha depend\u00eancia dele, pois \u00e9 simplesmente um intermedi\u00e1rio entre o WordPress e o servi\u00e7o) e especifica o gancho no servi\u00e7o que est\u00e1 instanciando.<\/p>\n<h3>Servi\u00e7os<\/h3>\n<p>Finalmente, os servi\u00e7os s\u00e3o os objetos que fazem todo o trabalho pesado em um plugin. Isso significa que, se eles precisarem ler ou gravar no banco de dados, no sistema de arquivos, na rede, nos dados do processo etc., tudo acontecer\u00e1 dentro de seu contexto.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-158242-61e6dadba8851.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-158242-61e6dadba8851.png\" alt=\"Usando um Registro, Assinantes e Servi\u00e7os no WordPress\"><\/a><\/p>\n<p>Foto de <a href=\"https:\/\/unsplash.com\/@introspectivedsgn?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Erik Mclean<\/a> no <a href=\"https:\/\/unsplash.com\/s\/photos\/service?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Unsplash<\/a><\/p>\n<p>Eles podem estar cientes de outras classes, eles podem n\u00e3o estar. Eles podem implementar uma interface ou uma classe abstrata ou n\u00e3o. Isso est\u00e1 realmente al\u00e9m do escopo deste post. Mas o ponto \u00e9 que, usando o gancho acima como exemplo, se voc\u00ea quiser fazer algo quando um usu\u00e1rio for exclu\u00eddo, fa\u00e7a isso dentro do servi\u00e7o.<\/p>\n<p>Por exemplo:<\/p>\n<pre><code>class DeletedUserService\n{\n    public function add(string $hook)\n    {\n        add_action($hook, [$this, 'deletedUser'], 99, 1);\n    }\n\n    public function deletedUser(int $userId)\n    {\n        $user = get_userdata($userId);\n        if (false === $user) {\n            return;\n        }\n\n        \/\/ Do work with the user that's being deleted.   \n    }\n}<\/code><\/pre>\n<p>E esse \u00e9 o fim. Assim que o servi\u00e7o for executado, o controle ser\u00e1 devolvido ao WordPress e o aplicativo continuar\u00e1 a execu\u00e7\u00e3o normalmente.<\/p>\n<h3>Todos juntos agora<\/h3>\n<p>Supondo que voc\u00ea tenha um arquivo bootstrap para seu plugin, o que a maioria faz, pois \u00e9 onde o plugin necess\u00e1rio \u00e9 definido, um autoloader \u00e9 necess\u00e1rio e a instancia\u00e7\u00e3o do pr\u00f3prio plugin ocorre.<\/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>Usar um Registro, Assinantes e Servi\u00e7os s\u00e3o \u00fateis ao criar plugins e utilit\u00e1rios centrados em back-end para WordPress. Este post mostra como fazer isso.<\/p>\n","protected":false},"author":1,"featured_media":158243,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,837,806,846,867],"tags":[1170],"class_list":["post-232137","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-guia-para-iniciantes","category-php-8","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/232137","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=232137"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/232137\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/158243"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=232137"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=232137"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=232137"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}