Estoy creando una aplicación Laravel, que tiene varias características diferentes. Quiero poder habilitarlos o deshabilitarlos según los requisitos de un dominio en particular. Actualmente, tengo en mi configuración una serie de banderas como:
'is_feature_1_enabled' => true,
'is_feature_2_enabled' => false,
... y así.
Luego, en mis controladores y vistas, verifico esos valores de configuración para ver si debo mostrar algo, permitiendo ciertas acciones, etc. Mi aplicación está comenzando a contaminarse con este tipo de comprobaciones en todas partes.
¿Existe un método de mejores prácticas para administrar funciones en una aplicación Laravel?
laravel
laravel-5
design-patterns
laravel-4
StackOverflowNewbie
fuente
fuente
Respuestas:
Esto se denomina técnicamente indicadores de características: https://martinfowler.com/articles/feature-toggles.html
depende de sus requisitos, banderas en la configuración / base de datos, despliegue, etc.
Pero básicamente está en el código y no puede estar limpio.
Paquetes Laravel:
https://github.com/alfred-nutile-inc/laravel-feature-flag
https://github.com/francescomalatesta/laravel-feature
Algunos servicios:
https://launchdarkly.com/
https://bullet-train.io/
https://configcat.com/
También mire https://marketingplatform.google.com/about/optimize/ para la interfaz.
fuente
Me encontré con el mismo problema cuando intenté implementar varios proveedores de hoteles.
Lo que hice fue usar el contenedor de servicio.
primero crearás una clase para cada dominio con sus características:
entonces usará el enlace en su proveedor de servicios de aplicaciones para vincular el dominio con la clase que usará.
Tenga en cuenta que puede usar la clase general que contiene las características para todos los dominios y luego usar esa clase general en sus clases
Finalmente en su controlador puede verificar su dominio y luego usar la clase que va a usar
fuente
Parece que está codificando cosas basadas en valores de configuración para habilitar o deshabilitar ciertas funciones. Le recomiendo que controle las cosas en función de las rutas con nombre en lugar del valor de configuración.
por lo que no tendrá las mismas condiciones repitiendo cada lugar e inflando su código ... aquí hay un código de muestra que le muestra cómo recuperar todas las rutas, y puede hacer coincidir el nombre del grupo de ruta para seguir el proceso para que coincida con su situación.
y aquí hay un ejemplo de controlador de middleware donde puede verificar si una característica particular está activa haciendo coincidir con lo que ya ha almacenado en su base de datos.
fuente
Suponiendo que esas características solo son necesarias para las solicitudes HTTP.
Crearía una
Features
clase base predeterminada con todas las banderas predeterminadas:Luego, ampliaría esa clase para cada dominio y establecería las anulaciones necesarias para ese dominio:
Luego cree un Middleware para vincular la Clase de entidades al contenedor:
No olvide adjuntar este middleware a sus rutas: a un grupo o para cada ruta.
Después de esto, puede TypeHint su clase de Características en sus controladores:
fuente
Laravel es genial con esto, incluso puede almacenar sus características en db y crear una relación entre el dominio.
Recomendaría usar Gates y Políticas, que le darán un mejor control en sus controladores y plantillas de Blade. Esto significa que registra las puertas desde su base de datos o codifíquelas.
Por ejemplo, si tiene una función de exportación de productos con un botón en su sistema y desea que esa función esté disponible para algunos usuarios, puede registrar las puertas con lógica empresarial.
Luego puede hacer lo siguiente en los controladores
Aquí hay un ejemplo para sus plantillas de cuchillas:
Más información disponible en https://laravel.com/docs/5.8/authorization
fuente
Interesante caso que tienes aquí. Puede ser interesante buscar una
Feature
interfaz o clase abstracta que contenga algunos métodos que generalmente necesita.Incluso podría dividir estos en
ExecutableFeature
yRenderableFeature
.Además, se podría hacer algún tipo de clase de fábrica para hacer la vida más fácil.
fuente
Lo que hice en mi caso fue crear una nueva tabla en la base de datos, podría llamarla,
Domains
por ejemplo.Agregue todas las características específicas, aquellas que podrían mostrarse en algunos dominios pero no en el resto, como columnas para esa tabla como bit para valores booleanos. Como, en mi caso
allow_multiple_bookings
,use_company_card
... lo que sea.Luego, considere crear una clase
Domain
y su repositorio respectivo, y solo pregunte estos valores en su código, tratando de insertar esa lógica lo más posible en su dominio (su modelo, servicios de aplicación, etc.).Por ejemplo, no haría la verificación del método del controlador
RequestBooking
si el dominio que solicita una reserva solo puede solicitar uno o más.En cambio, lo hago para
RequestBookingValidatorService
verificar si la fecha y hora de reserva ha pasado, el usuario tiene una tarjeta de crédito habilitada, ... o el dominio del que proviene esta acción puede solicitar más de una reserva (y luego si ya tiene ninguna).Esto agrega la conveniencia de la legibilidad, ya que ha llevado esta decisión a los servicios de su aplicación. Además, encuentro que cada vez que necesito una nueva característica puedo usar migraciones de Laravel (o Symfony) para agregar esa característica en la tabla e incluso podría actualizar sus filas (sus dominios) con los valores que quiero en el mismo compromiso que codifiqué.
fuente