Skip to content

Commit

Permalink
fix: adjust entitymanager closing
Browse files Browse the repository at this point in the history
  • Loading branch information
Gabriel Nogueira Berthier committed Jun 6, 2023
1 parent bc13827 commit 3e1d4a7
Show file tree
Hide file tree
Showing 9 changed files with 111 additions and 39 deletions.
1 change: 0 additions & 1 deletion app/Builder/AppBuilderManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
use Core\Http\Adapters\SlimFramework\SlimRouteCollector;
use Core\Http\RouterCollector;
use Exception;
use MiddlewareCollector;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface;
use Respect\Validation\Factory;
Expand Down
4 changes: 2 additions & 2 deletions app/Builder/MiddlewareCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

namespace Core\Builder;

use Core\Http\Interfaces\MiddlewareIncluder;
use Core\Http\Interfaces\MIddlewareIncluderInterface;
use Core\ResourceLoader;
use Middlewares\TrailingSlash;


class MiddlewareCollector
{
public static function collect(MiddlewareIncluder $root)
public static function collect(MIddlewareIncluderInterface $root)
{
$root->add(new TrailingSlash());

Expand Down
40 changes: 40 additions & 0 deletions app/Data/Doctrine/EntityManagerBuilder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace Core\Data\Doctrine;

use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Types\Type;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\ORMSetup;

class EntityManagerBuilder
{
public static function produce(array $doctrine): EntityManager
{
$devMode = $doctrine['dev_mode'];

$config = ORMSetup::createAttributeMetadataConfiguration(
$doctrine['metadata_dirs'],
$devMode
);

if (!Type::hasType('uuid')) {
Type::addType('uuid', 'Ramsey\Uuid\Doctrine\UuidType');
}


$connection = DriverManager::getConnection(
$doctrine['connection'],
$config
);

$entityManager = new EntityManager($connection, $config);

if (!Type::hasType('uuid_binary')) {
Type::addType('uuid_binary', 'Ramsey\Uuid\Doctrine\UuidBinaryType');
$entityManager->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('uuid_binary', 'binary');
}

return $entityManager;
}
}
25 changes: 25 additions & 0 deletions app/Decorators/ReopeningEntityManagerDecorator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Core\Decorators;

use Core\Data\Doctrine\EntityManagerBuilder;
use Doctrine\ORM\Decorator\EntityManagerDecorator;
use Psr\Container\ContainerInterface;

class ReopeningEntityManagerDecorator extends EntityManagerDecorator
{
public function __construct(private ContainerInterface $container)
{
parent::__construct(EntityManagerBuilder::produce($container->get('settings')['doctrine']));
}

public function open(): void
{
if (!$this->wrapped->isOpen()) {
$settings = $this->container->get('settings');
$doctrine = $settings['doctrine'];

$this->wrapped = EntityManagerBuilder::produce($doctrine);
}
}
}
38 changes: 6 additions & 32 deletions app/Definitions/database.php
Original file line number Diff line number Diff line change
@@ -1,43 +1,17 @@
<?php

use Doctrine\DBAL\Types\Type;
declare(strict_types=1);


use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Tools\Setup;
use Psr\Container\ContainerInterface;
use Doctrine\Common\Cache\Psr6\DoctrineProvider;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Core\Data\Doctrine\EntityManagerBuilder;

return [
EntityManager::class => static function (ContainerInterface $container): EntityManager {
$settings = $container->get('settings');
$doctrine = $settings['doctrine'];

$cache = $doctrine['dev_mode'] ?
DoctrineProvider::wrap(new ArrayAdapter()) :
DoctrineProvider::wrap(new FilesystemAdapter(directory: $doctrine['cache_dir']));

$config = Setup::createAttributeMetadataConfiguration(
$doctrine['metadata_dirs'],
$doctrine['dev_mode'],
null,
$cache
);

if (!Type::hasType('uuid')) {
Type::addType('uuid', 'Ramsey\Uuid\Doctrine\UuidType');
}

$entityManager = EntityManager::create(
$doctrine['connection'],
$config
);

if (!Type::hasType('uuid_binary')) {
Type::addType('uuid_binary', 'Ramsey\Uuid\Doctrine\UuidBinaryType');
$entityManager->getConnection()->getDatabasePlatform()->registerDoctrineTypeMapping('uuid_binary', 'binary');
}

return $entityManager;
return EntityManagerBuilder::produce($doctrine);
},
];
];
4 changes: 3 additions & 1 deletion app/Definitions/middlewares.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

use App\Presentation\Middleware\JWTAuthMiddleware;
use App\Presentation\Middleware\SessionMiddleware;
use Core\Http\Middlewares\DatabaseKeepAliveMiddleware;
use Slim\Middleware\BodyParsingMiddleware;

return [
SessionMiddleware::class,
JWTAuthMiddleware::class,
BodyParsingMiddleware::class
BodyParsingMiddleware::class,
DatabaseKeepAliveMiddleware::class
//ErrorMiddleware::class
];
4 changes: 2 additions & 2 deletions app/Http/Adapters/SlimFramework/SlimMiddlewareIncluder.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

namespace Core\Http\Adapters\SlimFramework;

use Core\Http\Interfaces\MiddlewareIncluder;
use Core\Http\Interfaces\MIddlewareIncluderInterface;
use Psr\Http\Server\MiddlewareInterface;
use Slim\App;

class SlimMiddlewareIncluder implements MiddlewareIncluder
class SlimMiddlewareIncluder implements MIddlewareIncluderInterface
{
public function __construct(private App $app)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

use Psr\Http\Server\MiddlewareInterface;

interface MiddlewareIncluder
interface MIddlewareIncluderInterface
{
function add(\Closure|MiddlewareInterface|string $middleware): void;
}
32 changes: 32 additions & 0 deletions app/Http/Middlewares/DatabaseKeepAliveMiddleware.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Core\Http\Middlewares;


use Core\Decorators\ReopeningEntityManagerDecorator;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class DatabaseKeepAliveMiddleware implements MiddlewareInterface
{
public function __construct(
private ReopeningEntityManagerDecorator $reopeningEntityManagerDecorator,
private ContainerInterface $containerInterface
) {
}

function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$this->reopeningEntityManagerDecorator->open();

try {
return $handler->handle($request);
} finally {
$this->reopeningEntityManagerDecorator->getConnection()->close();
$this->reopeningEntityManagerDecorator->clear();
}
}
}

0 comments on commit 3e1d4a7

Please sign in to comment.