commit
ce5df090b0
4 changed files with 107 additions and 0 deletions
-
0README
-
12composer.json
-
58lib/Common/EntityManagerFactory.php
-
37lib/Common/EntityRepositoryFactory.php
@ -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" |
|||
} |
|||
} |
|||
@ -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)); |
|||
} |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue