Browse Source

Initial commit

master
Jan Pavlíček 2 years ago
commit
ce5df090b0
  1. 0
      README
  2. 12
      composer.json
  3. 58
      lib/Common/EntityManagerFactory.php
  4. 37
      lib/Common/EntityRepositoryFactory.php

0
README

12
composer.json

@ -0,0 +1,12 @@
{
"name": "pavlicek.dev/webapp-doctrine-utils",
"description": "Collection of tools and utils useful when developing web application with Doctrine ORM and PostgreSQL",
"autoload": {
"psr-0": {"": "lib/"}
},
"require": {
"php": ">= 8.2.0",
"doctrine/orm": "*",
"symfony/cache": "~6.3"
}
}

58
lib/Common/EntityManagerFactory.php

@ -0,0 +1,58 @@
<?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) : EntityManager
{
self::checkRequiredParams($params, ['paths', 'database', 'proxy_dir']);
$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);
$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));
}
}
}

37
lib/Common/EntityRepositoryFactory.php

@ -0,0 +1,37 @@
<?php
namespace Common;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
/**
* Factory for doctrine repositories - provides adapter for the service locator pattern used
* to access repositories via entity manager, for the ability to use repositories in DI container
*
* @author Jan Pavlíček <jan.pavlicek@altekpro.cz>
* @since 1.0.0
*/
class EntityRepositoryFactory
{
/**
* @var Doctrine\ORM\EntityManager
*/
protected $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
/**
* Creates the repository using entity manager
*/
public function create(string $class) : EntityRepository
{
return $this->em->getRepository($class);
}
}
Loading…
Cancel
Save