Médio PHP

Backed enum para níveis de acesso

Enunciado

Crie um backed enum chamado NivelAcesso com valores string: Admin = 'admin', Editor = 'editor', Leitor = 'leitor'. Adicione um método podeEditar(): bool que retorna true para Admin e Editor, e false para Leitor. Use tryFrom para converter a string 'editor' em um caso e exiba o nome e se pode editar.

Requisitos

  • Definir backed enum NivelAcesso: string com os três casos e valores exatos.
  • Implementar método podeEditar(): bool usando match.
  • Usar tryFrom('editor') e verificar se não é nulo.
  • Exibir name e resultado de podeEditar() no formato Editor pode editar? Sim.

Código inicial

<?php

// Defina o backed enum NivelAcesso

// Use tryFrom e exiba o resultado

Saída esperada

Editor pode editar? Sim
Ver dica

tryFrom retorna ?NivelAcesso (pode ser null). Verifique com if ($nivel !== null) antes de usar.

Mostrar solução
<?php

// Backed enum com valores string
enum NivelAcesso: string {
    case Admin = 'admin';
    case Editor = 'editor';
    case Leitor = 'leitor';

    // Método que verifica permissão de edição
    public function podeEditar(): bool {
        return match($this) {
            self::Admin, self::Editor => true,
            self::Leitor => false,
        };
    }
}

// Converte string para caso usando tryFrom
$nivel = NivelAcesso::tryFrom('editor');

// Verifica se a conversão foi bem-sucedida
if ($nivel !== null) {
    $pode = $nivel->podeEditar() ? 'Sim' : 'Não';
    echo $nivel->name . ' pode editar? ' . $pode . PHP_EOL;
} else {
    echo 'Nível inválido' . PHP_EOL;
}

Passo a passo

  1. Declaramos o backed enum NivelAcesso com tipo string e atribuímos valores escalares a cada caso.
  2. O método podeEditar() usa match($this) para retornar true para Admin e Editor, e false para Leitor.
  3. Fora do enum, chamamos NivelAcesso::tryFrom('editor') que tenta converter a string em um caso.
  4. Como 'editor' existe, $nivel recebe o caso Editor; caso contrário, seria null.
  5. Verificamos se $nivel não é nulo e então exibimos o nome e o resultado de podeEditar().

Por que funciona

Backed enums associam um valor escalar a cada caso. O método estático tryFrom percorre os casos e retorna o que tiver o valor correspondente, ou null se não encontrar. Isso permite converter dados externos (como strings de um formulário) em tipos seguros. O método podeEditar() usa match para mapear cada caso a um booleano.

Erros comuns

  • Usar from em vez de tryFrom e não tratar a exceção: se o valor não existir, from lança ValueError.
  • Esquecer de verificar null após tryFrom: tentar chamar podeEditar() em null causa erro fatal.
  • Declarar o enum sem o tipo : string: isso criaria um enum puro e os valores seriam ignorados.

Outra forma de resolver

Poderia usar from dentro de um bloco try/catch:

try {
    $nivel = NivelAcesso::from('editor');
    // ...
} catch (\ValueError $e) {
    echo 'Nível inválido';
}

Mas tryFrom é mais limpo para casos onde o valor pode ser inválido.

Saída esperada

Editor pode editar? Sim