Posted on: October 07, 2025 04:20 PM
Posted by: Renato
Categories: Laravel laravelphp eloquent
Views: 101
🧠 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$hiddene$visibleno modelo. -
⚠️ Cuidado com dados sensíveis
Sempre pense bem antes de expor campos comopassword,tokens,keysetc. -
🔄 Combine com Accessors e Mutators
Você pode usarmakeHidden()emakeVisible()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 |
|---|---|---|---|
|
|
Permanente |
Global (afeta todos os modelos) |
|
|
|
Permanente |
Global |
|
|
|
Temporário |
Instância |
|
|
|
Temporário |
Instância |
|
🧰 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 |
|---|---|---|---|---|---|
|
|
Propriedade |
Global (todas as instâncias) |
Permanente |
|
Sempre oculta os campos indicados em todas as respostas JSON do modelo. |
|
|
Propriedade |
Global (todas as instâncias) |
Permanente |
|
Somente os campos listados serão mostrados em todas as respostas. |
|
|
Método |
Instância (temporário) |
Temporário (somente no objeto atual) |
|
Oculta apenas nesta resposta os campos passados, sem alterar o modelo globalmente. |
|
|
Método |
Instância (temporário) |
Temporário (somente no objeto atual) |
|
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() |
Donate to Site
Renato
Developer