You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.5 KiB
79 lines
2.5 KiB
<?php
|
|
|
|
namespace Common;
|
|
|
|
use Doctrine\Common\Proxy\AbstractProxyFactory;
|
|
use Doctrine\ORM\ORMSetup;
|
|
use Doctrine\ORM\EntityManager;
|
|
use Doctrine\DBAL\DriverManager;
|
|
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
|
|
use Symfony\Component\Cache\Adapter\ArrayAdapter;
|
|
use RuntimeException;
|
|
|
|
/**
|
|
* Factory for creating Doctrine entity manager - designed to work with DI Containers
|
|
*
|
|
* @author Jan Pavlíček <jan.pavlicek@altekpro.cz>
|
|
* @since 1.0.0
|
|
*/
|
|
class EntityManagerFactory
|
|
{
|
|
public static function create(array $params, bool $dev_mode = false, array $middlewares = [], array $filters = [], array $event_subscribers = []) : 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 ? true : false);
|
|
|
|
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);
|
|
|
|
if ($event_subscribers) {
|
|
$evm = $em->getEventManager();
|
|
foreach ($event_subscribers as $subscriber) {
|
|
$evm->addEventSubscriber($subscriber);
|
|
}
|
|
}
|
|
|
|
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));
|
|
}
|
|
}
|
|
}
|