Estou criando um aplicativo Laravel, que possui vários recursos. Quero poder habilitá-los ou desabilitá-los, dependendo dos requisitos de um domínio específico. Atualmente, tenho na minha configuração uma série de sinalizadores, como:
'is_feature_1_enabled' => true,
'is_feature_2_enabled' => false,
... e assim por diante.
Em meus controladores e visualizações, verifico esses valores de configuração para ver se devo exibir alguma coisa, permitindo determinadas ações etc. Meu aplicativo está começando a ficar poluído com esses tipos de verificações em todos os lugares.
Existe um método de práticas recomendadas para gerenciar recursos em um aplicativo Laravel?
laravel
laravel-5
design-patterns
laravel-4
StackOverflowNewbie
fonte
fonte
Respostas:
Isso é tecnicamente chamado de sinalizadores de recursos - https://martinfowler.com/articles/feature-toggles.html
depende de seus requisitos, sinalizadores em config / database, rollout, etc ...
Mas é basicamente se está no código e não pode ser limpo.
Pacotes Laravel:
https://github.com/alfred-nutile-inc/laravel-feature-flag
https://github.com/francescomalatesta/laravel-feature
Alguns serviços:
https://launchdarkly.com/
https://bullet-train.io/
https://configcat.com/
Veja também https://marketingplatform.google.com/about/optimize/ para obter front-end.
fonte
Encontrei o mesmo problema ao tentar implementar vários provedores de hotéis.
O que eu fiz foi usar o contêiner de serviço.
primeiro você criará uma classe para cada domínio Com seus recursos:
em seguida, você vai usar obrigatório em seu provedor de serviços aplicativo para vincular o domínio com classe para uso.
Observe que você pode usar a classe geral que contém os recursos de todos os domínios e, em seguida, usar essa classe geral em suas classes
Finalmente, no seu controlador, você pode verificar seu domínio e usar a classe que você usará
fonte
Parece que você está codificando as coisas com base nos valores de configuração para ativar ou desativar determinados recursos. Eu recomendo que você controle as coisas com base nas rotas nomeadas, em vez do valor da configuração.
portanto, você não terá as mesmas condições repetindo todos os locais e inchará o seu código. Aqui está um código de exemplo que mostra como recuperar todas as rotas e você pode combinar o nome do grupo de rotas para continuar o processo para atender à sua situação.
e aqui está um exemplo de manipulador de middleware, no qual você pode verificar se um recurso específico está ativo, correspondendo ao que você já armazenou em seu banco de dados.
fonte
Supondo que esses recursos sejam necessários apenas para solicitações HTTP.
Eu criaria uma
Features
classe base padrão com todos os sinalizadores padrão:Então eu estenderia essa classe para cada domínio e definiria as substituições necessárias para esse domínio:
Em seguida, crie um Middleware para vincular a classe Features ao contêiner:
Não se esqueça de anexar este middleware às suas rotas: a um grupo ou para cada rota.
Depois disso, você pode TypeHint sua classe Features em seus controladores:
fonte
O Laravel é ótimo com isso, você pode até armazenar seus recursos em db e criar uma relação entre o domínio.
Eu recomendaria usar Gates and Policies, o que lhe dará um melhor controle em seus controladores e modelos de blade. Isso significa que você registra as portas do seu banco de dados ou codifica-as.
Por exemplo, se você possui um recurso de produtos de exportação com um botão em seu sistema e deseja disponibilizar esse recurso para alguns usuários, pode registrar portões com lógica de negócios.
Então você pode fazer o seguinte nos controladores
Aqui está um exemplo para seus modelos de blade:
mais informações disponíveis em https://laravel.com/docs/5.8/authorization
fonte
Caso interessante que você tem aqui. Pode ser interessante procurar uma
Feature
interface ou classe abstrata que contenha alguns métodos que você geralmente precisa.Você pode até dividi-los em
ExecutableFeature
eRenderableFeature
.Mais adiante, algum tipo de classe fabril poderia ser feita para facilitar a vida.
fonte
O que fiz no meu caso foi criar uma nova tabela no banco de dados, você poderia chamá-lo,
Domains
por exemplo.Adicione todos os recursos específicos, aqueles que poderiam ser mostrados em alguns domínios, mas não nos demais, como colunas para essa tabela e como bit para valores booleanos. Como, no meu caso
allow_multiple_bookings
,use_company_card
... tanto faz.Em seguida, considere criar uma classe
Domain
e seu respectivo repositório e pergunte esses valores em seu código, tentando inserir o máximo possível essa lógica em seu domínio (seu modelo, serviços de aplicativos etc.).Por exemplo, eu não faria a verificação do método do controlador para saber
RequestBooking
se o domínio que está solicitando uma reserva pode solicitar apenas um ou mais.Em vez disso, faço isso em um
RequestBookingValidatorService
que pode verificar se a data e hora da reserva já passou, o usuário tem um cartão de crédito ativado ... ou o domínio do qual essa ação vem tem permissão para solicitar mais de uma reserva (e, se já tiver qualquer).Isso adiciona a conveniência da legibilidade, pois você levou essa decisão aos seus serviços de aplicativo. Além disso, acho que sempre que precisar de um novo recurso, posso usar as migrações do Laravel (ou Symfony) para adicionar esse recurso à tabela e até atualizar suas linhas (seus domínios) com os valores que quero no mesmo commit que codifiquei.
fonte