* @since 1.0.0 */ class EntityManagerFactory { public static function create(array $params, bool $dev_mode = false, array $middlewares = [], array $filters = []) : EntityManager { self::checkRequiredParams($params, ['paths', 'database', 'proxy_dir']); // workaround for doctrine console commands requiring active database connection - // specifying server version explicitly doesn't trigger this connection, which is not // needed for proxy generation if (defined('STDIN') && @$_SERVER['argv'][1] == 'orm:generate-proxies') { $params['database']['serverVersion'] = '14'; } $paths = $params['paths']; $connection = $params['database']; $cache_adapter = $dev_mode ? new ArrayAdapter : new FilesystemAdapter('', 0, $params['cache_dir']); $config = ORMSetup::createAttributeMetadataConfiguration($paths, $dev_mode, $params['proxy_dir'], $cache_adapter); $config->setAutoGenerateProxyClasses($dev_mode ? AbstractProxyFactory::AUTOGENERATE_ALWAYS : AbstractProxyFactory::AUTOGENERATE_NEVER); if ($middlewares) $config->setMiddlewares($middlewares); foreach ($filters as $name => $class) { $config->addFilter($name, $class); } $connection = DriverManager::getConnection($params['database'], $config); $em = new EntityManager($connection, $config); return $em; } /** * Validation method for checking parameters * * @throws RuntimeException */ private static function checkRequiredParams(array $params, array $required) : void { $errors = []; foreach ($required as $name) { if (!isset($params[$name])) { $errors[] = "Required parameter '$name' not found in array."; } } if ($errors) { throw new RuntimeException(implode(' ', $errors)); } } }