vendor/theofidry/alice-data-fixtures/src/Loader/PurgerLoader.php line 101

Open in your IDE?
  1. <?php
  2. /*
  3. * This file is part of the Fidry\AliceDataFixtures package.
  4. *
  5. * (c) Théo FIDRY <theo.fidry@gmail.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. declare(strict_types=1);
  11. namespace Fidry\AliceDataFixtures\Loader;
  12. use Fidry\AliceDataFixtures\LoaderInterface;
  13. use Fidry\AliceDataFixtures\Persistence\PersisterAwareInterface;
  14. use Fidry\AliceDataFixtures\Persistence\PersisterInterface;
  15. use Fidry\AliceDataFixtures\Persistence\PurgeMode;
  16. use Fidry\AliceDataFixtures\Persistence\PurgerFactoryInterface;
  17. use InvalidArgumentException;
  18. use Nelmio\Alice\IsAServiceTrait;
  19. use Psr\Log\LoggerInterface;
  20. use Psr\Log\NullLogger;
  21. /**
  22. * Loader decorating another loader to purge the database before loading.
  23. *
  24. * @final
  25. */
  26. /*final*/ class PurgerLoader implements LoaderInterface, PersisterAwareInterface
  27. {
  28. use IsAServiceTrait;
  29. public const PURGE_MODE_DELETE = 1;
  30. public const PURGE_MODE_TRUNCATE = 2;
  31. private static array $PURGE_MAPPING;
  32. private LoaderInterface $loader;
  33. private PurgerFactoryInterface $purgerFactory;
  34. private PurgeMode $defaultPurgeMode;
  35. private LoggerInterface $logger;
  36. public function __construct(
  37. LoaderInterface $decoratedLoader,
  38. PurgerFactoryInterface $purgerFactory,
  39. string $defaultPurgeMode,
  40. LoggerInterface $logger = null
  41. ) {
  42. if (!isset(self::$PURGE_MAPPING)) {
  43. self::$PURGE_MAPPING = [
  44. 'delete' => PurgeMode::createDeleteMode(),
  45. 'truncate' => PurgeMode::createTruncateMode(),
  46. 'no_purge' => PurgeMode::createNoPurgeMode(),
  47. ];
  48. }
  49. $this->loader = $decoratedLoader;
  50. $this->purgerFactory = $purgerFactory;
  51. if (false === in_array($defaultPurgeMode, ['delete', 'truncate', 'no_purge'], true)) {
  52. throw new InvalidArgumentException(
  53. sprintf(
  54. 'Unknown purge mode "%s". Use "delete", "truncate" or "no_purge".',
  55. $defaultPurgeMode
  56. )
  57. );
  58. }
  59. $this->defaultPurgeMode = self::$PURGE_MAPPING[$defaultPurgeMode];
  60. $this->logger = $logger ?? new NullLogger();
  61. }
  62. /**
  63. * @inheritdoc
  64. */
  65. public function withPersister(PersisterInterface $persister): self
  66. {
  67. $loader = $this->loader;
  68. if ($loader instanceof PersisterAwareInterface) {
  69. $loader = $loader->withPersister($persister);
  70. }
  71. foreach (self::$PURGE_MAPPING as $string => $mode) {
  72. if ($mode == $this->defaultPurgeMode) {
  73. $defaultPurgeMode = $string;
  74. break;
  75. }
  76. }
  77. return new self($loader, $this->purgerFactory, $defaultPurgeMode, $this->logger);
  78. }
  79. /**
  80. * Pre-process, persist and post process each object loaded.
  81. *
  82. * {@inheritdoc}
  83. */
  84. public function load(array $fixturesFiles, array $parameters = [], array $objects = [], PurgeMode $purgeMode = null): array
  85. {
  86. if (null === $purgeMode) {
  87. $purgeMode = $this->defaultPurgeMode;
  88. }
  89. if ($purgeMode != PurgeMode::createNoPurgeMode()) {
  90. $this->logger->info(
  91. sprintf(
  92. 'Purging database with purge mode "%s".',
  93. (string) $purgeMode
  94. )
  95. );
  96. $purger = $this->purgerFactory->create($purgeMode);
  97. $purger->purge();
  98. }
  99. return $this->loader->load($fixturesFiles, $parameters, $objects, $purgeMode);
  100. }
  101. }