{"id":230740,"date":"2022-12-04T12:52:00","date_gmt":"2022-12-04T09:52:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230740"},"modified":"2022-11-09T23:46:34","modified_gmt":"2022-11-09T20:46:34","slug":"usando-o-padrao-de-registro-no-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/usando-o-padrao-de-registro-no-wordpress\/","title":{"rendered":"Usando o padr\u00e3o de registro no WordPress"},"content":{"rendered":"\n<p>Eu tive algumas conversas com v\u00e1rios amigos e outros no Twitter sobre a no\u00e7\u00e3o de vari\u00e1veis \u200b\u200bglobais em linguagens de programa\u00e7\u00e3o. Para aqueles que s\u00e3o novos na programa\u00e7\u00e3o ou que n\u00e3o sabem por que s\u00e3o ruins:<\/p>\n<blockquote>\n<p>O uso de vari\u00e1veis \u200b\u200bglobais torna o software mais dif\u00edcil de ler e entender. Como qualquer c\u00f3digo em qualquer lugar do programa pode alterar o valor da vari\u00e1vel a qualquer momento, entender o uso da vari\u00e1vel pode implicar em entender uma grande parte do programa.<\/p>\n<\/blockquote>\n<p>Isso n\u00e3o quer dizer <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Global_variable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">que eles n\u00e3o tenham seu uso<\/a><\/strong>, mas se voc\u00ea estiver interessado em programa\u00e7\u00e3o orientada a objetos (especialmente em uma configura\u00e7\u00e3o do WordPress onde voc\u00ea usar\u00e1 PHP), \u00e9 importante entender algumas alternativas melhores do que vari\u00e1veis \u200b\u200bglobais.<\/p>\n<p>Ou seja, existem maneiras de trabalhar com a passagem de dados em seu aplicativo sem a necessidade de vari\u00e1veis \u200b\u200bglobais. E uma dessas maneiras \u00e9 o padr\u00e3o de registro.<\/p>\n<h2>O padr\u00e3o de registro no WordPress<\/h2>\n<p>Primeiro, observe que os padr\u00f5es de projeto transcendem qualquer padr\u00e3o espec\u00edfico. Desde que uma linguagem ofere\u00e7a os conceitos de objetos (ou mesmo abstra\u00e7\u00f5es), ent\u00e3o \u00e9 poss\u00edvel implementar o padr\u00e3o.<\/p>\n<p>Mas por que se preocupar em usar isso?<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163107-61e74a43bb7bf.jpg\" 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-163107-61e74a43bb7bf.jpg\" alt=\"Usando o padr\u00e3o de registro no WordPress\" ><\/a><\/p>\n<p>Foto de Samuel Zeller no Unsplash<\/p>\n<p>Em resumo, ele fornece uma maneira orientada a objetos de passar informa\u00e7\u00f5es ao redor de seu aplicativo sem a necessidade de vari\u00e1veis \u200b\u200bglobais. Coisas como <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cont\u00eaineres de inje\u00e7\u00e3o de depend\u00eancia<\/a><\/strong> tamb\u00e9m s\u00e3o boas para isso, mas est\u00e3o al\u00e9m do escopo deste post. Eu tamb\u00e9m diria que h\u00e1 momentos em que eles podem ser um exagero no contexto de pequenos plugins.<\/p>\n<h3>Implementando o padr\u00e3o<\/h3>\n<p>Com isso dito, como podemos implementar o padr\u00e3o de registro no WordPress e aproveit\u00e1-lo em todo o nosso trabalho? Vamos dar uma olhada na <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-00-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">estrutura b\u00e1sica do padr\u00e3o,<\/a><\/strong> primeiro:<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Serves as a registry for all objects that need to be accessed globally throughout the\n * plugin.\n *\/\nclass Registry\n{\n\n  \/**\n   * @var array The array used to the the various objects that will be used in the plugin.\n   *\/\n  private $storage;\n\n  \/**\n   * Initializes the plugin by creating an instance of an empty array.\n   *\/\n  public function __construct()\n  {\n      $this-&gt;storage = [];\n  }\n\n  \/**\n   * Adds an instance of a class to the registry's storage array using the given key\n   *\n   * @param string $id    The ID of the object to be used to retrieve it later in the plugin.\n   * @param mixed  $class An instance of the class that will be associated with the specified key.\n   *\/\n  public function add($id, $class)\n  {\n      $this-&gt;storage[$id] = $class;\n  }\n\n  \/**\n   * @param string $id    The ID of the object to retrieve from the repository.\n   * @return mixed $class An instance of the class associated with the specified key (or null if it doesn't exist).\n   *\/\n  public function get($id)\n  {\n      return array_key_exists($id, $this-&gt;storage)? $this-&gt;storage[$id]: null;\n  }\n}<\/code><\/pre>\n<p>Observe que sua implementa\u00e7\u00e3o \u00e9 bastante simples:<\/p>\n<ol>\n<li>A classe cont\u00e9m uma \u00fanica matriz como uma propriedade privada.<\/li>\n<li>Os dados s\u00e3o adicionados \u00e0 matriz com um ID espec\u00edfico.<\/li>\n<li>Os dados podem ser recuperados do padr\u00e3o com o ID.<\/li>\n<\/ol>\n<p>Voc\u00ea pode at\u00e9 levar esse padr\u00e3o espec\u00edfico para o pr\u00f3ximo n\u00edvel se ele aceitar apenas uma classe de um determinado tipo (como um AbstractEvent, por exemplo) e ent\u00e3o invocar automaticamente uma fun\u00e7\u00e3o na classe sempre que ela for passada (ou recuperada) do registro.<\/p>\n<p>Mas isso est\u00e1 entrando em uma implementa\u00e7\u00e3o mais complexa que eu gostaria para este post.<\/p>\n<h3>Configurando o Registro<\/h3>\n<p>Devido \u00e0 natureza do sistema de ganchos do WordPress, h\u00e1 uma maneira espec\u00edfica na qual o Registro deve ser configurado e registrado no WordPress.<\/p>\n<p>Digamos que voc\u00ea esteja trabalhando com um plugin. Dentro do arquivo bootstrap do plugin, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-01-register-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fa\u00e7a algo assim:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Creates a Registry using the Registry Design Pattern to store objects\n * that can be used throughout the plugin.\n *\n *\/\n$registry = new Registry();\nadd_filter('acmeRegistry', function() use ($registry) {\n  return $registry;\n});<\/code><\/pre>\n<p>Isso cria o registro e, em seguida, cria um filtro correspondente que podemos usar posteriormente no plugin para recuperar o registro e, portanto, outros objetos que ele mant\u00e9m.<\/p>\n<h3>Usando o Registro<\/h3>\n<p>Para adicionar um objeto ao registro, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-02-adding-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">chame a fun\u00e7\u00e3o add e passe um ID exclusivo e uma inst\u00e2ncia do objeto<\/a><\/strong>. Observe que nossa implementa\u00e7\u00e3o atual descartar\u00e1 todas as inst\u00e2ncias anteriores de um objeto que tenha a mesma chave e a substituir\u00e1 pelo que passarmos para ele.<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Get an reference to the repository and add an instance of a \n * PostManager to it. The PostManager is a class that allows us\n * to manipulate posts.\n *\/\n$this-&gt;registry = apply_filters('acmeRegistry', null);\n$this-&gt;registry-&gt;add('postManager', new PostManager());<\/code><\/pre>\n<p>A partir da\u00ed, voc\u00ea pode <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-03-using-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">recuperar os objetos<\/a><\/strong> que armazenou no registro:<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Get an reference to the repository, get a reference to the PostManager\n * then you can begin working with it.\n *\/\n$this-&gt;registry = apply_filters('acmeRegistry', null);\n$this-&gt;registry-&gt;add('postManager', new PostManager());\n\n\/\/ An example call that you can make to set the title of the post.\n$postManager-&gt;updateTitle('This Is the New Title');\n<\/code><\/pre>\n<p>E voc\u00ea pode us\u00e1-los como oyu faria de qualquer outra maneira. Mas isso evita a necessidade de uso de singletons, vari\u00e1veis \u200b\u200bglobais ou outras coisas perigosas.<\/p>\n<h2>Uma palavra sobre testabilidade<\/h2>\n<p>Outra vantagem que encontro com a implementa\u00e7\u00e3o desse padr\u00e3o \u00e9 que ele n\u00e3o apenas permite escrever testes de unidade com mais facilidade, mas tamb\u00e9m oferece a capacidade de escrever testes nos objetos que ele pode conter.<\/p>\n<p>Com isso, quero dizer que voc\u00ea pode escrever suas classes de forma mais independente do WordPress, separando assim a l\u00f3gica de dom\u00ednio do aplicativo principal e tornando-as mais representativas dos dados que devem manter.<\/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>Existem maneiras de trabalhar com a passagem de dados em seu aplicativo sem a necessidade de vari\u00e1veis \u200b\u200bglobais. E uma dessas maneiras \u00e9 o padr\u00e3o de registro.<\/p>\n","protected":false},"author":1,"featured_media":163108,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,846,867],"tags":[1170],"class_list":["post-230740","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230740","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=230740"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230740\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/163108"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230740"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230740"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230740"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}