Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\IntegrationsBundle\Migration; | |
use Doctrine\ORM\EntityManager; | |
use Mautic\IntegrationsBundle\Exception\PathNotFoundException; | |
class Engine | |
{ | |
private string $migrationsPath; | |
public function __construct( | |
private EntityManager $entityManager, | |
private string $tablePrefix, | |
string $pluginPath, | |
private string $bundleName | |
) { | |
$this->migrationsPath = $pluginPath.'/Migrations/'; | |
} | |
/** | |
* Run available migrations. | |
*/ | |
public function up(): void | |
{ | |
try { | |
$migrationClasses = $this->getMigrationClasses(); | |
} catch (PathNotFoundException $e) { | |
return; | |
} | |
if (!$migrationClasses) { | |
return; | |
} | |
$this->entityManager->beginTransaction(); | |
try { | |
foreach ($migrationClasses as $migrationClass) { | |
/** @var AbstractMigration $migration */ | |
$migration = new $migrationClass($this->entityManager, $this->tablePrefix); | |
if ($migration->shouldExecute()) { | |
$migration->execute(); | |
} | |
} | |
$this->entityManager->commit(); | |
} catch (\Doctrine\DBAL\Exception $e) { | |
$this->entityManager->rollback(); | |
throw $e; | |
} | |
} | |
/** | |
* Get migration classes to proceed. | |
* | |
* @return string[] | |
*/ | |
private function getMigrationClasses(): array | |
{ | |
$migrationFileNames = $this->getMigrationFileNames(); | |
$migrationClasses = []; | |
foreach ($migrationFileNames as $fileName) { | |
require_once $this->migrationsPath.$fileName; | |
$className = preg_replace('/\\.[^.\\s]{3,4}$/', '', $fileName); | |
$className = 'MauticPlugin\\'.$this->bundleName."\Migrations\\{$className}"; | |
$migrationClasses[] = $className; | |
} | |
return $migrationClasses; | |
} | |
/** | |
* Get migration file names. | |
* | |
* @return string[] | |
*/ | |
private function getMigrationFileNames(): array | |
{ | |
$fileNames = @scandir($this->migrationsPath); | |
if (false === $fileNames) { | |
throw new PathNotFoundException(sprintf("'%s' directory not found", $this->migrationsPath)); | |
} | |
return array_diff($fileNames, ['.', '..']); | |
} | |
} | |