Entendendo makeHidden() e makeVisible() no Laravel Eloquent

Posted on: October 07, 2025 04:20 PM

Posted by: Renato

Views: 102

🧠 Entendendo makeHidden() e makeVisible() no Laravel Eloquent

Ao trabalhar com modelos Eloquent no Laravel, muitas vezes você precisa controlar quais atributos serão exibidos ou ocultos nas respostas JSON da sua API.
Os métodos makeHidden() e makeVisible() oferecem uma forma simples e flexível de fazer isso dinamicamente.

Neste artigo, vamos entender o que esses métodos fazem, por que são úteis e como utilizá-los de forma eficaz.


🔍 O que são makeHidden() e makeVisible()?

  • makeHidden(): Oculta temporariamente um ou mais atributos na representação JSON do modelo.

  • makeVisible(): Torna temporariamente visíveis um ou mais atributos que estavam ocultos no modelo.

Esses métodos permitem controlar a visibilidade de atributos dinamicamente, conforme a necessidade da sua aplicação — sem alterar permanentemente o modelo.


⚙️ Por que usar makeHidden() e makeVisible()?

1. Controle dinâmico de atributos

Por padrão, você pode querer esconder campos como password, api_token ou outros dados sensíveis.
Mas em certos casos — como em ações administrativas ou de debug — pode ser necessário mostrar temporariamente essas informações.

2. Mais segurança e privacidade

Esses métodos ajudam a garantir que dados sensíveis sejam expostos apenas quando necessário, reduzindo o risco de vazamentos e melhorando a segurança.

3. Flexibilidade em respostas de API

Em APIs, às vezes você precisa ajustar os dados retornados dependendo do contexto do request, papel do usuário ou tipo de cliente.
Esses métodos tornam possível montar respostas JSON personalizadas e seguras.


🧩 Como usar makeHidden()

O método makeHidden() é usado para ocultar temporariamente um ou mais atributos na saída JSON de um modelo.

Exemplo básico: ocultando um atributo dinamicamente

$user = User::find(1);
$user->makeHidden('email');

return $user->toArray();

Neste exemplo, o campo email não será incluído na resposta JSON retornada ao cliente.

Ocultando múltiplos atributos

$user->makeHidden(['email', 'password', 'api_token']);

Assim, nenhum desses campos será exposto na resposta.


👁️ Como usar makeVisible()

O método makeVisible() é o oposto — ele serve para tornar visíveis atributos que normalmente estão ocultos.

Exemplo básico: exibindo um atributo escondido

Suponha que o modelo User tenha o campo api_token definido como oculto.
Podemos torná-lo visível temporariamente assim:

$user = User::find(1);
$user->makeVisible('api_token');

return $user->toArray();

Agora o campo api_token será incluído no JSON do usuário.

Tornando vários atributos visíveis

$user->makeVisible(['email', 'api_token']);

🧱 Exemplos práticos de uso

Exemplo 1: Ocultando dados sensíveis em um painel administrativo

$users = User::all()->map(function ($user) {
    return $user->makeHidden(['password', 'api_token']);
});

Aqui, os campos password e api_token são ocultados para todos os usuários retornados — útil para exibir listas em painéis administrativos sem expor informações críticas.


Exemplo 2: Exibindo dados condicionalmente conforme o papel do usuário

$user = Auth::user();

if ($user->isAdmin()) {
    $profile = $user->makeVisible(['email', 'api_token']);
} else {
    $profile = $user->makeHidden(['email', 'api_token']);
}

return $profile->toArray();

Neste caso, apenas administradores verão todos os atributos.
Usuários comuns verão uma versão restrita.


💡 Boas práticas

  • Use para modificações temporárias
    Esses métodos são para mudanças momentâneas.
    Para ocultar ou exibir permanentemente, use as propriedades $hidden e $visible no modelo.

  • ⚠️ Cuidado com dados sensíveis
    Sempre pense bem antes de expor campos como password, tokens, keys etc.

  • 🔄 Combine com Accessors e Mutators
    Você pode usar makeHidden() e makeVisible() junto com getters/setters personalizados para formatar dados antes de exibi-los.

  • Considere performance
    Alterar dinamicamente visibilidade em coleções grandes pode impactar o desempenho.
    Use com moderação.


🔍 Diferença entre makeHidden(), makeVisible() e as propriedades do modelo

Recurso

Tipo

Escopo

Exemplo

$hidden

Permanente

Global (afeta todos os modelos)

protected $hidden = ['password'];

$visible

Permanente

Global

protected $visible = ['name', 'email'];

makeHidden()

Temporário

Instância

$user->makeHidden('email')

makeVisible()

Temporário

Instância

$user->makeVisible('email')


🧰 Exemplos extras úteis

Exemplo 3: Mostrar detalhes extras apenas em modo debug

$user = User::find(1);

if (config('app.debug')) {
    $user->makeVisible(['api_token', 'last_login_ip']);
}

return $user->toArray();

Assim, em modo de desenvolvimento, atributos extras são exibidos para facilitar testes.


Exemplo 4: Controlar atributos via query param

$user = User::find(1);

if (request()->has('show_token')) {
    $user->makeVisible('api_token');
}

return response()->json($user);

Permite que o cliente inclua ?show_token=1 na URL para ver dados adicionais — útil em APIs administrativas.


Exemplo 5: Ocultar campos em uma coleção antes de enviar a resposta

return User::where('active', true)
    ->get()
    ->makeHidden(['password', 'remember_token']);

Assim todos os usuários ativos retornados já vêm com os campos ocultos.


🏁 Conclusão

Os métodos makeHidden() e makeVisible() são ferramentas poderosas para controlar dinamicamente a visibilidade de atributos em modelos Laravel.

Eles ajudam a:

  • proteger dados sensíveis,

  • ajustar respostas de API conforme o contexto,

  • e oferecer experiências personalizadas para diferentes usuários.

Saber quando e como usar essas funções é essencial para construir aplicações seguras, eficientes e bem estruturadas com Laravel.

aqui está um quadro comparativo visual e prático mostrando as diferenças entre $hidden, $visible, makeHidden() e makeVisible() no Laravel, com exemplos lado a lado e explicações resumidas.


🧩 Comparativo — Controle de Atributos no Laravel Eloquent

Método / Propriedade

Tipo

Escopo

Persistência

Exemplo de Uso

Resultado / Comportamento

$hidden

Propriedade

Global (todas as instâncias)

Permanente

php protected $hidden = ['password', 'api_token'];

Sempre oculta os campos indicados em todas as respostas JSON do modelo.

$visible

Propriedade

Global (todas as instâncias)

Permanente

php protected $visible = ['name', 'email'];

Somente os campos listados serão mostrados em todas as respostas.

makeHidden()

Método

Instância (temporário)

Temporário (somente no objeto atual)

php $user->makeHidden(['email']);

Oculta apenas nesta resposta os campos passados, sem alterar o modelo globalmente.

makeVisible()

Método

Instância (temporário)

Temporário (somente no objeto atual)

php $user->makeVisible(['api_token']);

Torna visíveis campos que estavam ocultos, apenas nesta resposta.


🧠 Exemplos comparativos lado a lado

🧱 1. Usando $hidden (ocultação permanente)

class User extends Model
{
    protected $hidden = ['password', 'api_token'];
}

$user = User::find(1);
return $user->toArray();

🧾 Saída:

{
  "id": 1,
  "name": "Renato Lucena",
  "email": "[email protected]"
}

➡️ Os campos password e api_token nunca aparecem, em nenhuma resposta.


⚙️ 2. Usando makeHidden() (ocultação temporária)

$user = User::find(1);
$user->makeHidden(['email']);

return $user->toArray();

🧾 Saída:

{
  "id": 1,
  "name": "Renato Lucena"
}

➡️ O campo email foi ocultado somente neste retorno, sem alterar o modelo globalmente.


👁️ 3. Usando makeVisible() (exibição temporária)

class User extends Model
{
    protected $hidden = ['api_token'];
}

$user = User::find(1);
$user->makeVisible('api_token');

return $user->toArray();

🧾 Saída:

{
  "id": 1,
  "name": "Renato Lucena",
  "email": "[email protected]",
  "api_token": "abc123xyz"
}

➡️ O campo api_token é exibido somente neste retorno — continua oculto por padrão nas outras respostas.


🧩 4. Combinação prática com Auth::user()

$user = Auth::user();

if ($user->isAdmin()) {
    $user->makeVisible(['email', 'api_token']);
} else {
    $user->makeHidden(['email', 'api_token']);
}

return response()->json($user);

🧾 Resultado:

  • 👑 Admins recebem todos os campos (inclusive api_token);

  • 👤 Usuários comuns recebem apenas informações básicas.


⚡ 5. Aplicando em coleções

$users = User::all()->makeHidden(['password', 'remember_token']);

➡️ Todos os usuários retornados terão esses campos ocultos — sem precisar mapear um por um.


✅ Dica Final

| Quer ocultar/exibir sempre? | ➜ Use $hidden ou $visible |
| Quer ocultar/exibir em certas situações (API, admin, debug)? | ➜ Use makeHidden() ou makeVisible() |

 


2

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

Laravel (227) PHP (151) linux (124) Variados (110) Dicas (58) ubuntu (58) developer (48) postgresql (45) database (44) sql (42) Docker (32) front-end (31) mysql (31) devops (26) webdev (24) programming (23) aws (19) tecnologia (19) eloquent (19) dba (18) OUTROS (17) backend (16) laravelphp (16) debian (12) dev (12) reactjs (10) 100DaysOfCode (10) git (10) react (10) nginx (9) inteligencia-artificial (9) PHP Swoole (9) node (9) javascript (9) linux-tools (8) Architecture (8) vue (7) github (7) ciencia (7) vscode (6) nodejs (6) api (6) webservice (6) vim (6) jwt (6) arquitetura (6) windows (6) authentication (5) ia (5) reactnative (5) rest (5) DevSecOps (5) s3 (5) servers (5) apache (5) macox (5) mariadb (4) jenkins (4) Kubernetes (4) gitlab (4) opensource (4) autenticacao (4) shell (4) mongodb (4) angular (4) inteligenciadedados (4) Padrao de design (4) artigo (4) wsl (4) Swoole (4) lets-encrypt (4) query (4) Raspberry (4) angularjs (4) google (4) npm (4) openai (4) CMS (2) sail (3) script (3) performance (3) js (3) mysqli (3) Black Hat (3) RabbitMQ (3) educacao (3) intel (3) fedora (3) containers (3) json (3) authorization (3) phpswoole (3) ddd (3) blade (3) terminal (3) log (3) mac (3) web (2) jobs (3) websocket (3) ssh (3) bash (3) hardware (3) tests (3) macos (3) db (3) politica (3) iot (2) ffmpeg (2) combustivel (2) webhook (2) microservices (2) Curisidades (2) Solid (2) zsh (2) Go (2) BigLinux (2) POO (2) LazyVim (2) gource (2) Python (2) Oauth2 (2) android (2) unix (2) magento (2) artificialintelligence (2) security (2) bancodedados (2) tailwind (2) homeOffice (2) html (2) openswoole (2) ArchLinux (2) java (2) saude (1) seguranca (2) auth (2) cron (2) phpunit (2) kube (2) multiple_authen (2) policia (2) neovim (2) golang (2) noticias (2) livros (2) Transcribe (2) ElonMusk (2) redis (2) claude (2) maps (2) colors (2) Passport (2) JQuery (2) phpfpm (2) autorizacao (2) monitoring (2) laptop (2) gnome (2) powerbi (2) telefonia (2) nvm (2) imagick (2) federal (1) ruby (1) AppSec (1) orm (1) ArquiteturaDeSoftware (1) Passwordless (1) memcached (1) flow (1) compression (1) athena (1) front (1) wine (1) covid19 (0) services (1) phpjasper (1) models (1) kali-linux (1) geojson (1) yarn (1) picpay (1) Monolith (1) banco (1) PNPM (1) Desenvolvedor (1) Structurizr (1) symfony (1) presenter (1) lider (1) guard (1) tensorflow (1) bootstrap (1) nuance (1) historia (1) dropbox (1) traefik (1) bug (1) akitando (1) llm (1) htm (1) transformers (1) cavalotroia (1) odd (1) m1 (1) Error (1) cinnamon (1) repmgr (1) vicuna (1) coding (1) rust (1) markdown (1) JasperReports (1) Fibonacci (1) community (1) Samurai (1) payment (1) messaging (1) Jesus (1) flutter (1) Migration (1) workflow (1) cqrs (1) kitematic (1) geospacial (1) yeshua (1) data (1) sonarqube (1) Axios (1) pipelines (1) Mozilla (1) kvm (1) GitOps (1) sqlite (1) podcast (1) n8n (1) LaravelFilament (1) God (1) DesenvolvimentoProfissional (1) sw (1) bigtech (1) postgres (1) NoCookies (1) LeetCode (1) governancadedados (1) prf (1) nosql (1) Lideranca (1) Hackers (1) Bots (1) pytorch (1) nuxt (1) liquid (1) ec2 (1) transaction (1) c4 (1) rancher (1) algoritimo (1) Observability (1) Elasticsearch (1) translate (1) certbot (1) Oh My Zsh (1) ibm (1) escopos (1) usb (1) ckeditor (1) API_KEY_GOOGLE_MAPS (1) Manjaro (1) mapas (1) Fetch (1) collections (1) RustLang (1) matematica (1) Filament (1) compactar (1) paypal (1) microg (1) forcas armadas (1) militar (1) fullsta (1) smartphones (1) automacao (1) Monitor (1) zend (1) spaceship (1) PKCE (1) l2tp (1) Glacier (1) laraveloctane (1) Deus (1) binaural (1) gpt (1) bolsonaro (1) privacidade (1) linkedin (1) documentation (1) brain (1) adb (1) nvidia (1) host (1) ecommerce (1) c4-models (1) altadisponibilidade (1) octane (1) lucena (1) http (1) TypeScript (1) chatgpt (1) idiomas (1) eventdrive (1) uuid (1) restfull (1) aplicativo (1) optimization (1) apple (1) oracle (1) iode (1) ffaa (1) vpn (1) MeioAmbiente (1) firefox (1) composer (1) scheduling (1) Asahi (1) pendrive (1) microservice (1) front (1) cor (1) auth (1) modelagemdedados (1) k8s (1) gasolina (1) wsl2 (1) csv (1) soap (1) piada (1) KubeCon (1) zorin-os (1) spring-boot (1) backup (1) playwright (1) Deepin (1) storage (1) benchmark (1) networking (1) Swoole (1) biologia (1) node-red (1) LETSENCRYPT (1) Grunt (1) Diagramas (1) boot (1) haru (1) dracula (1) TrabalhoEmEquipe (1) Brasil (1) queue (1) agi (1) llama (1) hotfix (1) economia (1) transcription (1) cache (1) Amazon (1) October (1) lumen (1) Hyperf (1) replication (1) faceapp (1) vala (1) cloudstack (1) rpi (1) controllers (0) OOD (0)

New Articles



Get Latest Updates by Email