Skip to content

Commit 8460357

Browse files
authored
Merge pull request #8 from sunrise-studio-development/release/v3.5
v3.5
2 parents 3c50e1d + d22493d commit 8460357

File tree

9 files changed

+343
-85
lines changed

9 files changed

+343
-85
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"squizlabs/php_codesniffer": "^3.11",
3131
"sunrise/http-router": "^3.0",
3232
"sunrise/hydrator": "^3.18",
33+
"symfony/cache": "^7.3",
3334
"symfony/validator": "^7.2",
3435
"vimeo/psalm": "^6.5"
3536
},

phpcs.xml.dist

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
<rule ref="Generic.PHP.RequireStrictTypes" />
55

66
<rule ref="Generic.Files.LineLength">
7-
<exclude-pattern>resources/*</exclude-pattern>
8-
<exclude-pattern>tests/*</exclude-pattern>
7+
<exclude-pattern>.</exclude-pattern>
98
</rule>
109

10+
<file>resources</file>
1111
<file>src</file>
1212
<file>tests</file>
1313
</ruleset>

resources/definitions/doctrine.php

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,46 +24,67 @@
2424
'doctrine.entity_manager_registry.logger' => get('doctrine.logger'),
2525

2626
'doctrine.entity_manager_parameters.*.entity_directories' => [],
27+
'doctrine.entity_manager_parameters.*.naming_strategy' => create(UnderscoreNamingStrategy::class),
28+
'doctrine.entity_manager_parameters.*.schema_asset_filters' => [],
29+
'doctrine.entity_manager_parameters.*.schema_ignore_classes' => [],
2730
'doctrine.entity_manager_parameters.*.proxy_directory' => string('{doctrine.system_temporary_directory}/doctrine-proxies'),
2831
'doctrine.entity_manager_parameters.*.proxy_namespace' => 'DoctrineProxies',
2932
'doctrine.entity_manager_parameters.*.proxy_autogenerate' => ProxyFactory::AUTOGENERATE_ALWAYS,
3033
'doctrine.entity_manager_parameters.*.default_cache' => get(CacheItemPoolInterface::class),
31-
'doctrine.entity_manager_parameters.*.naming_strategy' => create(UnderscoreNamingStrategy::class),
32-
'doctrine.entity_manager_parameters.*.logger' => get('doctrine.logger'),
33-
'doctrine.entity_manager_parameters.*.event_subscribers' => [],
34+
'doctrine.entity_manager_parameters.*.custom_datetime_functions' => [],
35+
'doctrine.entity_manager_parameters.*.custom_numeric_functions' => [],
36+
'doctrine.entity_manager_parameters.*.custom_string_functions' => [],
3437
'doctrine.entity_manager_parameters.*.middlewares' => [],
38+
'doctrine.entity_manager_parameters.*.event_subscribers' => [],
39+
'doctrine.entity_manager_parameters.*.configurators' => [],
40+
'doctrine.entity_manager_parameters.*.types' => [],
41+
'doctrine.entity_manager_parameters.*.logger' => get('doctrine.logger'),
3542

3643
'doctrine.entity_manager_parameters.default.name' => EntityManagerName::Default,
3744
'doctrine.entity_manager_parameters.default.dsn' => env('DATABASE_DSN'),
3845
'doctrine.entity_manager_parameters.default.entity_directories' => get('doctrine.entity_manager_parameters.*.entity_directories'),
46+
'doctrine.entity_manager_parameters.default.naming_strategy' => get('doctrine.entity_manager_parameters.*.naming_strategy'),
47+
'doctrine.entity_manager_parameters.default.schema_asset_filters' => get('doctrine.entity_manager_parameters.*.schema_asset_filters'),
48+
'doctrine.entity_manager_parameters.default.schema_ignore_classes' => get('doctrine.entity_manager_parameters.*.schema_ignore_classes'),
3949
'doctrine.entity_manager_parameters.default.proxy_directory' => get('doctrine.entity_manager_parameters.*.proxy_directory'),
4050
'doctrine.entity_manager_parameters.default.proxy_namespace' => get('doctrine.entity_manager_parameters.*.proxy_namespace'),
4151
'doctrine.entity_manager_parameters.default.proxy_autogenerate' => get('doctrine.entity_manager_parameters.*.proxy_autogenerate'),
4252
'doctrine.entity_manager_parameters.default.metadata_cache' => get('doctrine.entity_manager_parameters.default.default_cache'),
4353
'doctrine.entity_manager_parameters.default.query_cache' => get('doctrine.entity_manager_parameters.default.default_cache'),
4454
'doctrine.entity_manager_parameters.default.result_cache' => get('doctrine.entity_manager_parameters.default.default_cache'),
4555
'doctrine.entity_manager_parameters.default.default_cache' => get('doctrine.entity_manager_parameters.*.default_cache'),
46-
'doctrine.entity_manager_parameters.default.naming_strategy' => get('doctrine.entity_manager_parameters.*.naming_strategy'),
47-
'doctrine.entity_manager_parameters.default.logger' => get('doctrine.entity_manager_parameters.*.logger'),
48-
'doctrine.entity_manager_parameters.default.event_subscribers' => get('doctrine.entity_manager_parameters.*.event_subscribers'),
56+
'doctrine.entity_manager_parameters.default.custom_datetime_functions' => get('doctrine.entity_manager_parameters.*.custom_datetime_functions'),
57+
'doctrine.entity_manager_parameters.default.custom_numeric_functions' => get('doctrine.entity_manager_parameters.*.custom_numeric_functions'),
58+
'doctrine.entity_manager_parameters.default.custom_string_functions' => get('doctrine.entity_manager_parameters.*.custom_string_functions'),
4959
'doctrine.entity_manager_parameters.default.middlewares' => get('doctrine.entity_manager_parameters.*.middlewares'),
60+
'doctrine.entity_manager_parameters.default.event_subscribers' => get('doctrine.entity_manager_parameters.*.event_subscribers'),
61+
'doctrine.entity_manager_parameters.default.configurators' => get('doctrine.entity_manager_parameters.*.configurators'),
62+
'doctrine.entity_manager_parameters.default.types' => get('doctrine.entity_manager_parameters.*.types'),
63+
'doctrine.entity_manager_parameters.default.logger' => get('doctrine.entity_manager_parameters.*.logger'),
5064

5165
'doctrine.entity_manager_parameters_list' => [
5266
create(EntityManagerParameters::class)
5367
->constructor(
5468
name: get('doctrine.entity_manager_parameters.default.name'),
5569
dsn: get('doctrine.entity_manager_parameters.default.dsn'),
5670
entityDirectories: get('doctrine.entity_manager_parameters.default.entity_directories'),
71+
namingStrategy: get('doctrine.entity_manager_parameters.default.naming_strategy'),
72+
schemaAssetFilters: get('doctrine.entity_manager_parameters.default.schema_asset_filters'),
73+
schemaIgnoreClasses: get('doctrine.entity_manager_parameters.default.schema_ignore_classes'),
5774
proxyDirectory: get('doctrine.entity_manager_parameters.default.proxy_directory'),
5875
proxyNamespace: get('doctrine.entity_manager_parameters.default.proxy_namespace'),
5976
proxyAutogenerate: get('doctrine.entity_manager_parameters.default.proxy_autogenerate'),
6077
metadataCache: get('doctrine.entity_manager_parameters.default.metadata_cache'),
6178
queryCache: get('doctrine.entity_manager_parameters.default.query_cache'),
6279
resultCache: get('doctrine.entity_manager_parameters.default.result_cache'),
63-
namingStrategy: get('doctrine.entity_manager_parameters.default.naming_strategy'),
64-
logger: get('doctrine.entity_manager_parameters.default.logger'),
65-
eventSubscribers: get('doctrine.entity_manager_parameters.default.event_subscribers'),
80+
customDatetimeFunctions: get('doctrine.entity_manager_parameters.default.custom_datetime_functions'),
81+
customNumericFunctions: get('doctrine.entity_manager_parameters.default.custom_numeric_functions'),
82+
customStringFunctions: get('doctrine.entity_manager_parameters.default.custom_string_functions'),
6683
middlewares: get('doctrine.entity_manager_parameters.default.middlewares'),
84+
eventSubscribers: get('doctrine.entity_manager_parameters.default.event_subscribers'),
85+
configurators: get('doctrine.entity_manager_parameters.default.configurators'),
86+
types: get('doctrine.entity_manager_parameters.default.types'),
87+
logger: get('doctrine.entity_manager_parameters.default.logger'),
6788
)
6889
],
6990

src/AbstractEntityRepository.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
* @implements ObjectRepository<T>
1717
* @implements Selectable<int, T>
1818
*
19-
* @since v3.4.0
19+
* @since 3.4.0
2020
*/
2121
abstract class AbstractEntityRepository implements ObjectRepository, Selectable
2222
{
@@ -94,12 +94,8 @@ final public function findAll(): array
9494
*
9595
* @see EntityRepository::findBy()
9696
*/
97-
final public function findBy(
98-
array $criteria,
99-
?array $orderBy = null,
100-
?int $limit = null,
101-
?int $offset = null,
102-
): array {
97+
final public function findBy(array $criteria, ?array $orderBy = null, ?int $limit = null, ?int $offset = null): array
98+
{
10399
return $this->getEntityRepository()->findBy($criteria, $orderBy, $limit, $offset);
104100
}
105101

src/EntityManagerFactory.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Doctrine\Common\EventManager;
1717
use Doctrine\DBAL\DriverManager;
1818
use Doctrine\DBAL\Tools\DsnParser;
19+
use Doctrine\DBAL\Types\Type;
1920
use Doctrine\ORM\Configuration;
2021
use Doctrine\ORM\EntityManager;
2122
use Doctrine\ORM\EntityManagerInterface;
@@ -26,17 +27,32 @@
2627
public function createEntityManagerFromParameters(
2728
EntityManagerParametersInterface $entityManagerParameters,
2829
): EntityManagerInterface {
30+
foreach ($entityManagerParameters->getTypes() as $typeName => $typeClass) {
31+
Type::hasType($typeName) or Type::addType($typeName, $typeClass);
32+
}
33+
2934
$config = new Configuration();
3035
$config->setMetadataDriverImpl(new AttributeDriver($entityManagerParameters->getEntityDirectories()));
36+
$config->setNamingStrategy($entityManagerParameters->getNamingStrategy());
37+
$config->setSchemaAssetsFilter($entityManagerParameters->getSchemaAssetsFilter());
38+
$config->setSchemaIgnoreClasses($entityManagerParameters->getSchemaIgnoreClasses());
3139
$config->setProxyDir($entityManagerParameters->getProxyDirectory());
3240
$config->setProxyNamespace($entityManagerParameters->getProxyNamespace());
3341
$config->setAutoGenerateProxyClasses($entityManagerParameters->getProxyAutogenerate());
3442
$config->setMetadataCache($entityManagerParameters->getMetadataCache());
3543
$config->setQueryCache($entityManagerParameters->getQueryCache());
3644
$config->setResultCache($entityManagerParameters->getResultCache());
37-
$config->setNamingStrategy($entityManagerParameters->getNamingStrategy());
45+
$config->setCustomDatetimeFunctions($entityManagerParameters->getCustomDatetimeFunctions());
46+
/** @psalm-suppress InvalidArgument */
47+
/** @phpstan-ignore-next-line */
48+
$config->setCustomNumericFunctions($entityManagerParameters->getCustomNumericFunctions());
49+
$config->setCustomStringFunctions($entityManagerParameters->getCustomStringFunctions());
3850
$config->setMiddlewares($entityManagerParameters->getMiddlewares());
3951

52+
foreach ($entityManagerParameters->getConfigurators() as $configurator) {
53+
$configurator($config);
54+
}
55+
4056
$connParams = (new DsnParser())->parse($entityManagerParameters->getDsn());
4157
$connection = DriverManager::getConnection($connParams, $config);
4258

src/EntityManagerParameters.php

Lines changed: 107 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,16 @@
1616
use Doctrine\Common\EventSubscriber;
1717
use Doctrine\DBAL\Driver\Middleware;
1818
use Doctrine\DBAL\Logging\Middleware as LoggingMiddleware;
19+
use Doctrine\DBAL\Types\Type;
20+
use Doctrine\ORM\Configuration;
1921
use Doctrine\ORM\Mapping\NamingStrategy;
22+
use Doctrine\ORM\Mapping\UnderscoreNamingStrategy;
2023
use Doctrine\ORM\Proxy\ProxyFactory;
24+
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
2125
use Psr\Cache\CacheItemPoolInterface;
2226
use Psr\Log\LoggerInterface;
2327
use SensitiveParameter;
28+
use Symfony\Component\Cache\Adapter\ArrayAdapter;
2429

2530
final readonly class EntityManagerParameters implements EntityManagerParametersInterface
2631
{
@@ -29,20 +34,34 @@ public function __construct(
2934
#[SensitiveParameter]
3035
private string $dsn,
3136
/** @var array<array-key, string> */
32-
private array $entityDirectories,
33-
private string $proxyDirectory,
34-
private string $proxyNamespace,
35-
/** @var ProxyFactory::AUTOGENERATE_* */
36-
private int $proxyAutogenerate,
37-
private CacheItemPoolInterface $metadataCache,
38-
private CacheItemPoolInterface $queryCache,
39-
private CacheItemPoolInterface $resultCache,
40-
private NamingStrategy $namingStrategy,
41-
private ?LoggerInterface $logger = null,
42-
/** @var array<string, EventSubscriber> */
43-
private array $eventSubscribers = [],
37+
private array $entityDirectories = [],
38+
private ?NamingStrategy $namingStrategy = null,
39+
/** @var array<array-key, callable(mixed):bool> */
40+
private array $schemaAssetFilters = [],
41+
/** @var list<class-string> */
42+
private array $schemaIgnoreClasses = [],
43+
private ?string $proxyDirectory = null,
44+
private ?string $proxyNamespace = null,
45+
/** @var (ProxyFactory::AUTOGENERATE_*)|null */
46+
private ?int $proxyAutogenerate = null,
47+
private ?CacheItemPoolInterface $metadataCache = null,
48+
private ?CacheItemPoolInterface $queryCache = null,
49+
private ?CacheItemPoolInterface $resultCache = null,
50+
/** @var array<string, class-string<FunctionNode>|callable(string):FunctionNode> */
51+
private array $customDatetimeFunctions = [],
52+
/** @var array<string, class-string<FunctionNode>|callable(string):FunctionNode> */
53+
private array $customNumericFunctions = [],
54+
/** @var array<string, class-string<FunctionNode>|callable(string):FunctionNode> */
55+
private array $customStringFunctions = [],
4456
/** @var array<array-key, Middleware> */
4557
private array $middlewares = [],
58+
/** @var array<string, EventSubscriber> */
59+
private array $eventSubscribers = [],
60+
/** @var array<array-key, callable(Configuration):void> */
61+
private array $configurators = [],
62+
/** @var array<string, class-string<Type>> */
63+
private array $types = [],
64+
private ?LoggerInterface $logger = null,
4665
) {
4766
}
4867

@@ -64,55 +83,90 @@ public function getEntityDirectories(): array
6483
return $this->entityDirectories;
6584
}
6685

86+
public function getNamingStrategy(): NamingStrategy
87+
{
88+
return $this->namingStrategy ?? new UnderscoreNamingStrategy();
89+
}
90+
91+
/**
92+
* @inheritDoc
93+
*/
94+
public function getSchemaAssetsFilter(): callable
95+
{
96+
return function (mixed $asset): bool {
97+
foreach ($this->schemaAssetFilters as $filter) {
98+
if ($filter($asset) === false) {
99+
return false;
100+
}
101+
}
102+
103+
return true;
104+
};
105+
}
106+
107+
/**
108+
* @inheritDoc
109+
*/
110+
public function getSchemaIgnoreClasses(): array
111+
{
112+
return $this->schemaIgnoreClasses;
113+
}
114+
67115
public function getProxyDirectory(): string
68116
{
69-
return $this->proxyDirectory;
117+
return $this->proxyDirectory ?? \sys_get_temp_dir() . '/doctrine-proxies';
70118
}
71119

72120
public function getProxyNamespace(): string
73121
{
74-
return $this->proxyNamespace;
122+
return $this->proxyNamespace ?? 'DoctrineProxies';
75123
}
76124

77125
/**
78126
* @inheritDoc
79127
*/
80128
public function getProxyAutogenerate(): int
81129
{
82-
return $this->proxyAutogenerate;
130+
return $this->proxyAutogenerate ?? ProxyFactory::AUTOGENERATE_ALWAYS;
83131
}
84132

85133
public function getMetadataCache(): CacheItemPoolInterface
86134
{
87-
return $this->metadataCache;
135+
return $this->metadataCache ?? new ArrayAdapter();
88136
}
89137

90138
public function getQueryCache(): CacheItemPoolInterface
91139
{
92-
return $this->queryCache;
140+
return $this->queryCache ?? new ArrayAdapter();
93141
}
94142

95143
public function getResultCache(): CacheItemPoolInterface
96144
{
97-
return $this->resultCache;
145+
return $this->resultCache ?? new ArrayAdapter();
98146
}
99147

100-
public function getNamingStrategy(): NamingStrategy
148+
/**
149+
* @inheritDoc
150+
*/
151+
public function getCustomDatetimeFunctions(): array
101152
{
102-
return $this->namingStrategy;
153+
return $this->customDatetimeFunctions;
103154
}
104155

105-
public function getLogger(): ?LoggerInterface
156+
/**
157+
* @inheritDoc
158+
*/
159+
public function getCustomNumericFunctions(): array
106160
{
107-
return $this->logger;
161+
return $this->customNumericFunctions;
108162
}
109163

110164
/**
111165
* @inheritDoc
112166
*/
113-
public function getEventSubscribers(): array
167+
public function getCustomStringFunctions(): array
114168
{
115-
return $this->eventSubscribers;
169+
return $this->customStringFunctions;
116170
}
117171

118172
/**
@@ -128,4 +182,33 @@ public function getMiddlewares(): array
128182

129183
return $middlewares;
130184
}
185+
186+
/**
187+
* @inheritDoc
188+
*/
189+
public function getEventSubscribers(): array
190+
{
191+
return $this->eventSubscribers;
192+
}
193+
194+
/**
195+
* @inheritDoc
196+
*/
197+
public function getConfigurators(): array
198+
{
199+
return $this->configurators;
200+
}
201+
202+
/**
203+
* @inheritDoc
204+
*/
205+
public function getTypes(): array
206+
{
207+
return $this->types;
208+
}
209+
210+
public function getLogger(): ?LoggerInterface
211+
{
212+
return $this->logger;
213+
}
131214
}

0 commit comments

Comments
 (0)