Enums e lang no Laravel

eunael

Natanael Alves

Posted on September 17, 2024

Enums e lang no Laravel

Relato
Num projeto que trabalhei, havia um campo de select que tinha valores definidos e que não iriam ter alteração. Então, para listar os itens desse select, resolvi criar uma classe de enumeração e daí descrever esse valores. Porém, o projeto precisava dar suporte às linguagens inglês e espanhol, e o texto das opções do select precisavam de adaptar a isso sem perder a referência do respectivo item do enum. Ou seja, se eu selecionasse o item "cavalo", eu precisava que o sistema soubesse que esse item ainda é "cavalo" mesmo ele aparecendo como "horse" ou "caballo". Foi pra manter a integridades dos dados que criei a seguinte estrutura integrando o enum e o lang no projeto.

O que são os Enums
Uma breve introdução. A partir da versão 8.1 do PHP, foi introduzida uma classe especial para enumerar valores. Na prática, quer dizer que podemos criar uma classe que os valores das suas propriedades serão constantes. Um exemplo são status, pois se deixar livre provavelmente ao longo do código vai ter um status "ativo", outro "Ativo", outro "Active" slá. Mas seu amarra o status a um enum e usar o enum invés de digitar a string, terei a certeza que em qualquer lugar do código o valor vai ser sempre aquele que está no enum.

enum Status
{
    case ATIVO = "ativo";
    case INATIVO = "inativo";
    case PENDENTE = "pendente";
}
Enter fullscreen mode Exit fullscreen mode

Enums e o lang
Como o enum é uma classe, eu posso criar métodos para a minha classe normalmente. Então, criei o método display() que será o responsável por tratar a visualização do meu valor do enum adaptando-o para o idioma que o usuário está usando, porém, sem alterar o valor original no meu item do enum. Ou seja, para o usuário, o status aparece "Pendiente", ou "Pending", ou "Pendente"; mas no banco está salvo somente como "pendente" - que é o valor original e por ele eu consigo pegar o meu item do enum, e desse item usar o método display que mostrar ele traduzido para o usuário.
Mas antes de mostrar o exemplo, uma introdução ao lang do Laravel. O lang é uma pasta na raiz do projeto para armazenar traduções que o seu projeto vai dar suporte. Cada idioma tem uma pasta, e nessa pasta arquivos para contextos de traduções. Nesses arquivos tem um array, onde a chave é uma representação da palavra e o valor é a tradução para o respectivo idioma.

Image description

Configurando o método display
Na pasta lang, vou criar um arquivo status.php para cada pasta de idioma com o seguinte array:

<?php
[
    Status::ATIVO->value => "Ativo",
    Status::INATIVO->value => "Inativo",
    Status::PENDENTE->value => "Pendente",
];
Enter fullscreen mode Exit fullscreen mode

Corrijo os valores do array para a respectiva traduções do respectivo idioma.
E meu método display vai buscar a tradução do item do enum nesses arquivos status.php e retornar esse valor.

public function display(): string
{
    return trans('status.'.$this->value);
}
Enter fullscreen mode Exit fullscreen mode

Exemplo de uso:

// EN
echo Status::ATIVO->display(); // Active

// PT_BR
echo Status::INATIVO->display(); // Inativo

// ES
echo Status::PENDENTE->display(); // Pediente
Enter fullscreen mode Exit fullscreen mode

Conclusão
Com isso, eu garanto que meu valor do enum continue constante no meu código, mas ele se adapta ao idioma do usuário usando o método display sem perder a integridade dos dados. Além também de ficar flexível caso eu adicione um novo idioma ao sistema. Espero que tenham gostado dessa e até a próxima.

💖 💪 🙅 🚩
eunael
Natanael Alves

Posted on September 17, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related