Nessuna descrizione

FeaturesController.php 2.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <?php
  2. namespace MailPoet\Features;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoetVendor\Doctrine\DBAL\Exception\TableNotFoundException;
  5. class FeaturesController {
  6. const RE_ENGAGEMENT_EMAIL = 're-engagement-email';
  7. // Define feature defaults in the array below in the following form:
  8. // self::FEATURE_NAME_OF_FEATURE => true,
  9. private $defaults = [
  10. self::RE_ENGAGEMENT_EMAIL => false,
  11. ];
  12. /** @var array */
  13. private $flags;
  14. /** @var FeatureFlagsRepository */
  15. private $featureFlagsRepository;
  16. public function __construct(
  17. FeatureFlagsRepository $featureFlagsRepository
  18. ) {
  19. $this->featureFlagsRepository = $featureFlagsRepository;
  20. }
  21. /** @return bool */
  22. public function isSupported($feature) {
  23. if (!$this->exists($feature)) {
  24. throw new \RuntimeException("Unknown feature '$feature'");
  25. }
  26. // ensure controller works even if used before migrator, return default value in such case
  27. try {
  28. $this->ensureFlagsLoaded();
  29. } catch (TableNotFoundException $e) {
  30. return $this->defaults[$feature];
  31. }
  32. return $this->flags[$feature];
  33. }
  34. /** @return bool */
  35. public function exists($feature) {
  36. return array_key_exists($feature, $this->defaults);
  37. }
  38. /** @return array */
  39. public function getDefaults() {
  40. return $this->defaults;
  41. }
  42. /** @return array */
  43. public function getAllFlags() {
  44. $this->ensureFlagsLoaded();
  45. return $this->flags;
  46. }
  47. private function ensureFlagsLoaded() {
  48. if ($this->flags !== null) {
  49. return;
  50. }
  51. $flagsMap = $this->getValueMap();
  52. $this->flags = [];
  53. foreach ($this->defaults as $name => $default) {
  54. $this->flags[$name] = isset($flagsMap[$name]) ? $flagsMap[$name] : $default;
  55. }
  56. }
  57. private function getValueMap() {
  58. $features = $this->featureFlagsRepository->findAll();
  59. $featuresMap = [];
  60. foreach ($features as $feature) {
  61. $featuresMap[$feature->getName()] = (bool)$feature->getValue();
  62. }
  63. return $featuresMap;
  64. }
  65. }