{"id":5870,"date":"2026-04-08T13:04:29","date_gmt":"2026-04-08T16:04:29","guid":{"rendered":"https:\/\/thiagorossi.com.br\/blog\/?p=5870"},"modified":"2026-04-08T13:07:03","modified_gmt":"2026-04-08T16:07:03","slug":"validacao-no-cakephp","status":"publish","type":"post","link":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/","title":{"rendered":"Valida\u00e7\u00e3o no CakePHP"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Tempo de leitura: <\/span> <span class=\"rt-time\"> 6<\/span> <span class=\"rt-label rt-postfix\">minutos<\/span><\/span>\n<p class=\"has-medium-font-size wp-block-paragraph\">Valida\u00e7\u00e3o no CakePHP: A integridade dos dados \u00e9 o que separa um sistema profissional de um projeto amador propenso a falhas e vulnerabilidades. Se voc\u00ea j\u00e1 tem suas tabelas conectadas pelas associa\u00e7\u00f5es que vimos no artigo anterior, agora precisa garantir que ningu\u00e9m insira um &#8220;e-mail&#8221; que na verdade \u00e9 apenas um texto qualquer, ou que um usu\u00e1rio consiga salvar um artigo sem t\u00edtulo.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Como especialista em <strong>CakePHP<\/strong>, preparei este d\u00e9cimo primeiro artigo para detalhar uma das maiores for\u00e7as deste framework: a separa\u00e7\u00e3o clara entre <strong>valida\u00e7\u00e3o de entrada<\/strong> e <strong>regras de neg\u00f3cio<\/strong>. Vamos aprender a usar <strong>Validation<\/strong> e <strong>BuildRules<\/strong> para criar uma blindagem em torno do seu banco de dados.<\/p>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\">Validation &amp; BuildRules: Como garantir que apenas dados limpos entrem no banco<\/h2>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Valida\u00e7\u00e3o no CakePHP: No CakePHP, a prote\u00e7\u00e3o dos dados n\u00e3o acontece em um \u00fanico bloco de c\u00f3digo confuso. O framework inteligentemente separa o processo em duas camadas distintas que ocorrem em momentos diferentes do ciclo de vida da requisi\u00e7\u00e3o.<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li class=\"has-medium-font-size\"><strong>Validation (Valida\u00e7\u00e3o):<\/strong> Foca no formato e na presen\u00e7a dos dados brutos. (Ex: &#8220;Isto \u00e9 um e-mail v\u00e1lido?&#8221;, &#8220;Este campo tem pelo menos 10 caracteres?&#8221;).<\/li>\n\n\n\n<li class=\"has-medium-font-size\"><strong>BuildRules (Regras de Aplica\u00e7\u00e3o):<\/strong> Foca no contexto e no estado do banco de dados. (Ex: &#8220;Este e-mail j\u00e1 existe no sistema?&#8221;, &#8220;Este autor_id realmente existe na tabela de usu\u00e1rios?&#8221;).<\/li>\n<\/ol>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Dominar essas duas camadas \u00e9 essencial para manter a sanidade do seu blog e a seguran\u00e7a dos seus dados.<\/p>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\">1. A Primeira Linha de Defesa: Validation<\/h2>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">A camada de <strong>Validation<\/strong> \u00e9 a primeira a ser executada. No momento em que voc\u00ea usa o m\u00e9todo <code>$this-&gt;Artigos-&gt;patchEntity($entidade, $dados)<\/code>, o CakePHP aciona o validador. Se os dados n\u00e3o passarem por aqui, eles sequer chegam a ser processados para o salvamento.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">As valida\u00e7\u00f5es ficam dentro do seu <strong>Table Object<\/strong> (<code>src\/Model\/Table\/ArtigosTable.php<\/code>), especificamente no m\u00e9todo <code>validationDefault<\/code>.<\/p>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Exemplo Pr\u00e1tico de Valida\u00e7\u00e3o<\/h3>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">PHP<\/p>\n\n\n\n<pre class=\"wp-block-code has-medium-font-size\"><code>public function validationDefault(Validator $validator): Validator\n{\n    $validator\n        -&gt;integer('id')\n        -&gt;allowEmptyString('id', 'create');\n\n    $validator\n        -&gt;scalar('titulo')\n        -&gt;minLength('titulo', 5, 'O t\u00edtulo precisa ter pelo menos 5 caracteres')\n        -&gt;maxLength('titulo', 255)\n        -&gt;requirePresence('titulo', 'create')\n        -&gt;notEmptyString('titulo', 'Por favor, preencha o t\u00edtulo do artigo');\n\n    $validator\n        -&gt;email('contato_email', false, 'Insira um e-mail v\u00e1lido para contato');\n\n    return $validator;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>Por que isso \u00e9 incr\u00edvel?<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Porque o CakePHP usa essas regras para gerar automaticamente mensagens de erro que podem ser exibidas nas suas <strong>Views<\/strong>. Se o usu\u00e1rio deixar o campo vazio, o objeto da entidade retornar\u00e1 os erros e o <code>FormHelper<\/code> cuidar\u00e1 de mostrar o aviso em vermelho para o usu\u00e1rio sem que voc\u00ea precise escrever um \u00fanico <code>if<\/code> manual para isso.<\/p>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\">2. A Segunda Camada: BuildRules (Regras de Aplica\u00e7\u00e3o)<\/h2>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Muitas vezes, um dado pode estar no formato correto (valida\u00e7\u00e3o OK), mas ser inv\u00e1lido para a sua regra de neg\u00f3cio. Por exemplo: um e-mail est\u00e1 bem formatado, mas ele j\u00e1 pertence a outro usu\u00e1rio.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Diferente da valida\u00e7\u00e3o, as <strong>BuildRules<\/strong> s\u00e3o verificadas apenas no momento do <code>save()<\/code>. Elas dependem do acesso ao banco de dados para conferir a integridade.<\/p>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Exemplo de Regras de Aplica\u00e7\u00e3o<\/h3>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">PHP<\/p>\n\n\n\n<pre class=\"wp-block-code has-medium-font-size\"><code>use Cake\\ORM\\RulesChecker;\n\npublic function buildRules(RulesChecker $rules): RulesChecker\n{\n    \/\/ Garante que o e-mail seja \u00fanico na tabela\n    $rules-&gt;add($rules-&gt;isUnique(&#91;'email'], 'Este e-mail j\u00e1 est\u00e1 cadastrado.'));\n\n    \/\/ Garante que o categoria_id fornecido realmente exista na tabela Categorias\n    $rules-&gt;add($rules-&gt;existsIn(&#91;'categoria_id'], 'Categorias', 'A categoria selecionada n\u00e3o \u00e9 v\u00e1lida.'));\n\n    return $rules;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>A Diferen\u00e7a Vital:<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Enquanto o <code>Validator<\/code> verifica a &#8220;forma&#8221;, o <code>RulesChecker<\/code> verifica o &#8220;contexto&#8221;. Se voc\u00ea tentar salvar um artigo com uma <code>categoria_id<\/code> que n\u00e3o existe, o validador deixar\u00e1 passar (pois \u00e9 um n\u00famero inteiro v\u00e1lido), mas a <code>BuildRules<\/code> impedir\u00e1 o salvamento para evitar um erro de integridade referencial no MySQL.<\/p>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\">3. Criando Valida\u00e7\u00f5es Customizadas<\/h2>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">O CakePHP j\u00e1 vem com dezenas de valida\u00e7\u00f5es prontas (e-mail, cart\u00f5es de cr\u00e9dito, upload de arquivos, datas, etc.). Mas e se voc\u00ea precisar de algo muito espec\u00edfico, como validar um CPF ou uma regra pr\u00f3pria?<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Voc\u00ea pode criar m\u00e9todos de valida\u00e7\u00e3o personalizados diretamente no seu Table Object:<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">PHP<\/p>\n\n\n\n<pre class=\"wp-block-code has-medium-font-size\"><code>$validator-&gt;add('slug', 'custom', &#91;\n    'rule' =&gt; function ($value, $context) {\n        \/\/ Regra: o slug n\u00e3o pode conter a palavra \"teste\"\n        return strpos($value, 'teste') === false;\n    },\n    'message' =&gt; 'O slug n\u00e3o pode conter termos de teste.'\n]);\n<\/code><\/pre>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\">4. M\u00faltiplos Conjuntos de Valida\u00e7\u00e3o<\/h2>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Uma das maiores dores de cabe\u00e7a em outros frameworks \u00e9 quando voc\u00ea precisa de valida\u00e7\u00f5es diferentes para a mesma tabela. Por exemplo: no cadastro r\u00e1pido do blog, voc\u00ea s\u00f3 pede o e-mail; no perfil completo, voc\u00ea exige endere\u00e7o e CPF.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">No CakePHP, voc\u00ea pode criar m\u00e9todos como <code>validationPerfilCompleto<\/code> e cham\u00e1-los no Controller:<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">PHP<\/p>\n\n\n\n<pre class=\"wp-block-code has-medium-font-size\"><code>\/\/ No Controller\n$artigo = $this-&gt;Artigos-&gt;patchEntity($artigo, $this-&gt;request-&gt;getData(), &#91;\n    'validate' =&gt; 'perfilCompleto'\n]);\n<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Isso d\u00e1 uma flexibilidade absurda ao seu sistema, permitindo que a mesma Model se comporte de formas diferentes dependendo da situa\u00e7\u00e3o.<\/p>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\">5. Onde os Erros Aparecem?<\/h2>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Quando a valida\u00e7\u00e3o ou as regras falham, o m\u00e9todo <code>save()<\/code> retorna <code>false<\/code>. Mas onde est\u00e3o os erros? Eles ficam guardados dentro da pr\u00f3pria <strong>Entity<\/strong>.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">PHP<\/p>\n\n\n\n<pre class=\"wp-block-code has-medium-font-size\"><code>if ($this-&gt;Artigos-&gt;save($artigo)) {\n    \/\/ Sucesso\n} else {\n    \/\/ Para ver os erros no debug:\n    debug($artigo-&gt;getErrors());\n}\n<\/code><\/pre>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">O CakePHP mapeia esses erros campo a campo. O <code>FormHelper<\/code> nas suas Views l\u00ea esse array de erros e anexa as mensagens diretamente abaixo dos inputs correspondentes.<\/p>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\">6. Boas Pr\u00e1ticas para Dados Limpos<\/h2>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Para garantir que seu blog de 500 artigos e seus projetos SaaS sejam blindados, siga estas diretrizes:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li class=\"has-medium-font-size\"><strong>N\u00e3o confie no Front-end:<\/strong> Valida\u00e7\u00f5es em JavaScript s\u00e3o \u00f3timas para a experi\u00eancia do usu\u00e1rio, mas nunca substituem a valida\u00e7\u00e3o no PHP (Server-side).<\/li>\n\n\n\n<li class=\"has-medium-font-size\"><strong>Use a camada de Model:<\/strong> Nunca fa\u00e7a valida\u00e7\u00f5es manuais dentro do Controller. Isso quebra o padr\u00e3o MVC e dificulta a manuten\u00e7\u00e3o.<\/li>\n\n\n\n<li class=\"has-medium-font-size\"><strong>Aproveite a Conven\u00e7\u00e3o:<\/strong> Se voc\u00ea definiu um campo como <code>NOT NULL<\/code> no banco de dados via <strong>Migrations<\/strong>, o Bake j\u00e1 gerar\u00e1 as valida\u00e7\u00f5es b\u00e1sicas de <code>notEmpty<\/code> para voc\u00ea.<\/li>\n\n\n\n<li class=\"has-medium-font-size\"><strong>Limpeza antes da Valida\u00e7\u00e3o:<\/strong> Use o recurso de <code>_beforeMarshal<\/code> no Table para limpar dados (como remover m\u00e1scaras de CPF ou formatar strings) antes que o validador entre em a\u00e7\u00e3o.<\/li>\n<\/ol>\n\n\n\n<div style=\"height:35px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-large-font-size\">Conclus\u00e3o: Seguran\u00e7a que Gera Tranquilidade<\/h2>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Valida\u00e7\u00e3o no CakePHP: Entender a distin\u00e7\u00e3o entre <strong>Validation<\/strong> e <strong>BuildRules<\/strong> \u00e9 o que transforma voc\u00ea em um desenvolvedor CakePHP de elite. Ao delegar a responsabilidade de &#8220;limpeza&#8221; e &#8220;integridade&#8221; para a Model, seu Controller fica magro e sua aplica\u00e7\u00e3o se torna previs\u00edvel e segura.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Dados limpos significam menos bugs em produ\u00e7\u00e3o, relat\u00f3rios mais precisos e, acima de tudo, uma experi\u00eancia de uso confi\u00e1vel para os internautas do seu blog. Voc\u00ea n\u00e3o est\u00e1 apenas salvando dados; voc\u00ea est\u00e1 protegendo o patrim\u00f4nio de informa\u00e7\u00e3o do seu projeto.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Mas antes de dominar o CakePHP, se for o seu caso, toda jornada tem um in\u00edcio. Vamos entender quais s\u00e3o os conhecimentos b\u00e1sicos necess\u00e1rios para aproveitar ao m\u00e1ximo este poderoso framework. Para iniciar seus estudos no CakePHP, voc\u00ea precisar\u00e1 dominar as seguintes tecnologias:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"\/blog\/categoria\/html\" target=\"_blank\" rel=\" noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"758\" height=\"426\" src=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/04\/html.webp\" alt=\"HTML\" class=\"wp-image-600\" srcset=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/04\/html.webp 758w, https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/04\/html-300x169.webp 300w\" sizes=\"auto, (max-width: 758px) 100vw, 758px\" \/><\/a><figcaption class=\"wp-element-caption\">HTML<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"\/blog\/categoria\/css\" target=\"_blank\" rel=\" noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"758\" height=\"426\" src=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/04\/Capa-Artigos-Linux.webp\" alt=\"CSS\" class=\"wp-image-702\" srcset=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/04\/Capa-Artigos-Linux.webp 758w, https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/04\/Capa-Artigos-Linux-300x169.webp 300w\" sizes=\"auto, (max-width: 758px) 100vw, 758px\" \/><\/a><figcaption class=\"wp-element-caption\">CSS<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"\/blog\/categoria\/javascript\" target=\"_blank\" rel=\" noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"758\" height=\"426\" src=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/04\/javascript.webp\" alt=\"Javascript\" class=\"wp-image-804\" srcset=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/04\/javascript.webp 758w, https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/04\/javascript-300x169.webp 300w\" sizes=\"auto, (max-width: 758px) 100vw, 758px\" \/><\/a><figcaption class=\"wp-element-caption\">JavaScript<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"\/blog\/categoria\/sql\" target=\"_blank\" rel=\" noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"758\" height=\"426\" src=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/05\/Capa-Artigos-2.webp\" alt=\"SQL\" class=\"wp-image-942\" srcset=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/05\/Capa-Artigos-2.webp 758w, https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/05\/Capa-Artigos-2-300x169.webp 300w\" sizes=\"auto, (max-width: 758px) 100vw, 758px\" \/><\/a><figcaption class=\"wp-element-caption\">SQL<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"\/blog\/categoria\/php\" target=\"_blank\" rel=\" noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"758\" height=\"426\" src=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/11\/Capa-PHP.png\" alt=\"Capa Curso PHP\" class=\"wp-image-2835\" srcset=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/11\/Capa-PHP.png 758w, https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/11\/Capa-PHP-300x169.png 300w\" sizes=\"auto, (max-width: 758px) 100vw, 758px\" \/><\/a><figcaption class=\"wp-element-caption\">PHP<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">E se voc\u00ea gosta do nosso conte\u00fado, n\u00e3o deixe de contribuir adquirindo os servi\u00e7os e produtos dos nossos apoiadores e empresas que somos associados.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/hostinger.com.br\/?REFERRALCODE=1THIAGO62\" target=\"_blank\" rel=\" noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"250\" src=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/03\/hostinger.png\" alt=\"Hospedagem Hostinger\" class=\"wp-image-92\"\/><\/a><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/amzn.to\/3SNDYlc\" target=\"_blank\" rel=\" noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"250\" src=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/08\/ofertas-amazon.webp\" alt=\"Ofertas Amazon\" class=\"wp-image-1308\"\/><\/a><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/amzn.to\/3SNKmt0\" target=\"_blank\" rel=\" noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"250\" src=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/08\/amazonprime.webp\" alt=\"Amazon Prime\" class=\"wp-image-1307\"\/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Agora que seus dados est\u00e3o validados e seguros, \u00e9 hora de aprender a otimizar a l\u00f3gica que processa essas informa\u00e7\u00f5es. No pr\u00f3ximo artigo, veremos: <strong>&#8220;Request &amp; Response: Manipulando dados de entrada e cabe\u00e7alhos.&#8221;<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>Dica de Especialista:<\/strong> Sempre que uma regra de neg\u00f3cio envolver compara\u00e7\u00e3o de dados entre tabelas diferentes, prefira usar <code>BuildRules<\/code>. Se a regra for apenas sobre o formato do dado isolado, use <code>Validation<\/code>. Essa separa\u00e7\u00e3o deixar\u00e1 seus testes unit\u00e1rios muito mais f\u00e1ceis de escrever no futuro!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Tempo de leitura: <\/span> <span class=\"rt-time\"> 6<\/span> <span class=\"rt-label rt-postfix\">minutos<\/span><\/span>Valida\u00e7\u00e3o no CakePHP: A integridade dos dados \u00e9 o que separa um sistema profissional de&#8230;<\/p>\n","protected":false},"author":1,"featured_media":5819,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[97],"tags":[],"class_list":["post-5870","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cakephp","wpcat-97-id"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Valida\u00e7\u00e3o no CakePHP - BLOG THIAGO ROSSI<\/title>\n<meta name=\"description\" content=\"Valida\u00e7\u00e3o no CakePHP:: No CakePHP, a prote\u00e7\u00e3o dos dados n\u00e3o acontece em um \u00fanico bloco de c\u00f3digo confuso. O framework inteligentemente ...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Valida\u00e7\u00e3o no CakePHP - BLOG THIAGO ROSSI\" \/>\n<meta property=\"og:description\" content=\"Valida\u00e7\u00e3o no CakePHP:: No CakePHP, a prote\u00e7\u00e3o dos dados n\u00e3o acontece em um \u00fanico bloco de c\u00f3digo confuso. O framework inteligentemente ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/\" \/>\n<meta property=\"og:site_name\" content=\"BLOG THIAGO ROSSI\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-08T16:04:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-08T16:07:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2026\/04\/capa-cakephp.png\" \/>\n\t<meta property=\"og:image:width\" content=\"758\" \/>\n\t<meta property=\"og:image:height\" content=\"426\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Thiago Rossi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Thiago Rossi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/validacao-no-cakephp\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/validacao-no-cakephp\\\/\"},\"author\":{\"name\":\"Thiago Rossi\",\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/5f28286948ec2afdeb2e044a2196cd87\"},\"headline\":\"Valida\u00e7\u00e3o no CakePHP\",\"datePublished\":\"2026-04-08T16:04:29+00:00\",\"dateModified\":\"2026-04-08T16:07:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/validacao-no-cakephp\\\/\"},\"wordCount\":1111,\"publisher\":{\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/validacao-no-cakephp\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/capa-cakephp.png\",\"articleSection\":[\"CakePHP\"],\"inLanguage\":\"pt-BR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/validacao-no-cakephp\\\/\",\"url\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/validacao-no-cakephp\\\/\",\"name\":\"Valida\u00e7\u00e3o no CakePHP - BLOG THIAGO ROSSI\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/validacao-no-cakephp\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/validacao-no-cakephp\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/capa-cakephp.png\",\"datePublished\":\"2026-04-08T16:04:29+00:00\",\"dateModified\":\"2026-04-08T16:07:03+00:00\",\"description\":\"Valida\u00e7\u00e3o no CakePHP:: No CakePHP, a prote\u00e7\u00e3o dos dados n\u00e3o acontece em um \u00fanico bloco de c\u00f3digo confuso. O framework inteligentemente ...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/validacao-no-cakephp\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/validacao-no-cakephp\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/validacao-no-cakephp\\\/#primaryimage\",\"url\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/capa-cakephp.png\",\"contentUrl\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/capa-cakephp.png\",\"width\":758,\"height\":426,\"caption\":\"CakePHP\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/validacao-no-cakephp\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Valida\u00e7\u00e3o no CakePHP\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/\",\"name\":\"THIAGO ROSSI\",\"description\":\"Mais de 20 anos de experi\u00eancia no mercado de TI!\",\"publisher\":{\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/#organization\"},\"alternateName\":\"TR | CURSO WEB DEV\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/#organization\",\"name\":\"THIAGO ROSSI\",\"alternateName\":\"TR | CURSO WEB DEV\",\"url\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/new-logo.webp\",\"contentUrl\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/new-logo.webp\",\"width\":300,\"height\":300,\"caption\":\"THIAGO ROSSI\"},\"image\":{\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/linkedin.com\\\/in\\\/thiagox86\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/5f28286948ec2afdeb2e044a2196cd87\",\"name\":\"Thiago Rossi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bb28b4665f4162bab9fbef8db5a7f00597f79ab90ece9a67189bb6bce78d5786?s=96&d=retro&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bb28b4665f4162bab9fbef8db5a7f00597f79ab90ece9a67189bb6bce78d5786?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bb28b4665f4162bab9fbef8db5a7f00597f79ab90ece9a67189bb6bce78d5786?s=96&d=retro&r=g\",\"caption\":\"Thiago Rossi\"},\"description\":\"Com mais de 20 anos de jornada na tecnologia, minha trajet\u00f3ria evoluiu do ensino t\u00e9cnico \u00e0 arquitetura de sistemas complexos. Hoje, foco minha expertise no desenvolvimento de solu\u00e7\u00f5es de Intelig\u00eancia Artificial nativa e an\u00e1lise de dados p\u00fablicos, utilizando o ecossistema PHP para transformar dados brutos em transpar\u00eancia e efici\u00eancia. Como autor e desenvolvedor, acredito na democratiza\u00e7\u00e3o do conhecimento. Essa vis\u00e3o resultou em uma biblioteca de mais de 530 artigos gratuitos, cobrindo desde a base do WebDev e Infraestrutura at\u00e9 os bastidores da ind\u00fastria de Jogos e IA. No universo de Game Design, sou autor do livro \\\"GDD \u2013 O Guia Definitivo\\\" e documento ativamente meus processos atrav\u00e9s de DevLogs, unindo rigor t\u00e9cnico e criatividade em projetos desenvolvidos com GDevelop 5. Meu compromisso \u00e9 conectar engenharia de ponta com as reais oportunidades do mercado de tecnologia.\",\"sameAs\":[\"https:\\\/\\\/thiagorossi.com.br\\\/blog\",\"https:\\\/\\\/instagram.com\\\/thiagorossix86\",\"https:\\\/\\\/linkedin.com\\\/in\\\/thiagox86\"],\"url\":\"https:\\\/\\\/thiagorossi.com.br\\\/blog\\\/author\\\/thiagorossi\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Valida\u00e7\u00e3o no CakePHP - BLOG THIAGO ROSSI","description":"Valida\u00e7\u00e3o no CakePHP:: No CakePHP, a prote\u00e7\u00e3o dos dados n\u00e3o acontece em um \u00fanico bloco de c\u00f3digo confuso. O framework inteligentemente ...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/","og_locale":"pt_BR","og_type":"article","og_title":"Valida\u00e7\u00e3o no CakePHP - BLOG THIAGO ROSSI","og_description":"Valida\u00e7\u00e3o no CakePHP:: No CakePHP, a prote\u00e7\u00e3o dos dados n\u00e3o acontece em um \u00fanico bloco de c\u00f3digo confuso. O framework inteligentemente ...","og_url":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/","og_site_name":"BLOG THIAGO ROSSI","article_published_time":"2026-04-08T16:04:29+00:00","article_modified_time":"2026-04-08T16:07:03+00:00","og_image":[{"width":758,"height":426,"url":"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2026\/04\/capa-cakephp.png","type":"image\/png"}],"author":"Thiago Rossi","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Thiago Rossi","Est. tempo de leitura":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/#article","isPartOf":{"@id":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/"},"author":{"name":"Thiago Rossi","@id":"https:\/\/thiagorossi.com.br\/blog\/#\/schema\/person\/5f28286948ec2afdeb2e044a2196cd87"},"headline":"Valida\u00e7\u00e3o no CakePHP","datePublished":"2026-04-08T16:04:29+00:00","dateModified":"2026-04-08T16:07:03+00:00","mainEntityOfPage":{"@id":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/"},"wordCount":1111,"publisher":{"@id":"https:\/\/thiagorossi.com.br\/blog\/#organization"},"image":{"@id":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/#primaryimage"},"thumbnailUrl":"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2026\/04\/capa-cakephp.png","articleSection":["CakePHP"],"inLanguage":"pt-BR"},{"@type":"WebPage","@id":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/","url":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/","name":"Valida\u00e7\u00e3o no CakePHP - BLOG THIAGO ROSSI","isPartOf":{"@id":"https:\/\/thiagorossi.com.br\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/#primaryimage"},"image":{"@id":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/#primaryimage"},"thumbnailUrl":"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2026\/04\/capa-cakephp.png","datePublished":"2026-04-08T16:04:29+00:00","dateModified":"2026-04-08T16:07:03+00:00","description":"Valida\u00e7\u00e3o no CakePHP:: No CakePHP, a prote\u00e7\u00e3o dos dados n\u00e3o acontece em um \u00fanico bloco de c\u00f3digo confuso. O framework inteligentemente ...","breadcrumb":{"@id":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/#primaryimage","url":"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2026\/04\/capa-cakephp.png","contentUrl":"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2026\/04\/capa-cakephp.png","width":758,"height":426,"caption":"CakePHP"},{"@type":"BreadcrumbList","@id":"https:\/\/thiagorossi.com.br\/blog\/validacao-no-cakephp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/thiagorossi.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"Valida\u00e7\u00e3o no CakePHP"}]},{"@type":"WebSite","@id":"https:\/\/thiagorossi.com.br\/blog\/#website","url":"https:\/\/thiagorossi.com.br\/blog\/","name":"THIAGO ROSSI","description":"Mais de 20 anos de experi\u00eancia no mercado de TI!","publisher":{"@id":"https:\/\/thiagorossi.com.br\/blog\/#organization"},"alternateName":"TR | CURSO WEB DEV","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/thiagorossi.com.br\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/thiagorossi.com.br\/blog\/#organization","name":"THIAGO ROSSI","alternateName":"TR | CURSO WEB DEV","url":"https:\/\/thiagorossi.com.br\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/thiagorossi.com.br\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/04\/new-logo.webp","contentUrl":"https:\/\/thiagorossi.com.br\/blog\/wp-content\/uploads\/2024\/04\/new-logo.webp","width":300,"height":300,"caption":"THIAGO ROSSI"},"image":{"@id":"https:\/\/thiagorossi.com.br\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/linkedin.com\/in\/thiagox86"]},{"@type":"Person","@id":"https:\/\/thiagorossi.com.br\/blog\/#\/schema\/person\/5f28286948ec2afdeb2e044a2196cd87","name":"Thiago Rossi","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/bb28b4665f4162bab9fbef8db5a7f00597f79ab90ece9a67189bb6bce78d5786?s=96&d=retro&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/bb28b4665f4162bab9fbef8db5a7f00597f79ab90ece9a67189bb6bce78d5786?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bb28b4665f4162bab9fbef8db5a7f00597f79ab90ece9a67189bb6bce78d5786?s=96&d=retro&r=g","caption":"Thiago Rossi"},"description":"Com mais de 20 anos de jornada na tecnologia, minha trajet\u00f3ria evoluiu do ensino t\u00e9cnico \u00e0 arquitetura de sistemas complexos. Hoje, foco minha expertise no desenvolvimento de solu\u00e7\u00f5es de Intelig\u00eancia Artificial nativa e an\u00e1lise de dados p\u00fablicos, utilizando o ecossistema PHP para transformar dados brutos em transpar\u00eancia e efici\u00eancia. Como autor e desenvolvedor, acredito na democratiza\u00e7\u00e3o do conhecimento. Essa vis\u00e3o resultou em uma biblioteca de mais de 530 artigos gratuitos, cobrindo desde a base do WebDev e Infraestrutura at\u00e9 os bastidores da ind\u00fastria de Jogos e IA. No universo de Game Design, sou autor do livro \"GDD \u2013 O Guia Definitivo\" e documento ativamente meus processos atrav\u00e9s de DevLogs, unindo rigor t\u00e9cnico e criatividade em projetos desenvolvidos com GDevelop 5. Meu compromisso \u00e9 conectar engenharia de ponta com as reais oportunidades do mercado de tecnologia.","sameAs":["https:\/\/thiagorossi.com.br\/blog","https:\/\/instagram.com\/thiagorossix86","https:\/\/linkedin.com\/in\/thiagox86"],"url":"https:\/\/thiagorossi.com.br\/blog\/author\/thiagorossi\/"}]}},"_links":{"self":[{"href":"https:\/\/thiagorossi.com.br\/blog\/wp-json\/wp\/v2\/posts\/5870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thiagorossi.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thiagorossi.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thiagorossi.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thiagorossi.com.br\/blog\/wp-json\/wp\/v2\/comments?post=5870"}],"version-history":[{"count":2,"href":"https:\/\/thiagorossi.com.br\/blog\/wp-json\/wp\/v2\/posts\/5870\/revisions"}],"predecessor-version":[{"id":5872,"href":"https:\/\/thiagorossi.com.br\/blog\/wp-json\/wp\/v2\/posts\/5870\/revisions\/5872"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thiagorossi.com.br\/blog\/wp-json\/wp\/v2\/media\/5819"}],"wp:attachment":[{"href":"https:\/\/thiagorossi.com.br\/blog\/wp-json\/wp\/v2\/media?parent=5870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thiagorossi.com.br\/blog\/wp-json\/wp\/v2\/categories?post=5870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thiagorossi.com.br\/blog\/wp-json\/wp\/v2\/tags?post=5870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}