DEV Community

Cover image for Enums e lang no Laravel
Natanael Alves
Natanael Alves

Posted on

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.

Sentry blog image

How to reduce TTFB

In the past few years in the web dev world, we’ve seen a significant push towards rendering our websites on the server. Doing so is better for SEO and performs better on low-powered devices, but one thing we had to sacrifice is TTFB.

In this article, we’ll see how we can identify what makes our TTFB high so we can fix it.

Read more

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay