Skip to content

Commit ccbbab2

Browse files
alongoszbarw4
authored andcommitted
IBX-8400: Fixed redundancy in RepositoryFactory implementations (#384)
For more details see https://issues.ibexa.co/browse/IBX-8400 and #384 Key changes: * Dropped support for dynamic Core Repository class in RepositoryFactory * Made RepositoryFactory not Container-aware * Deprecated Core Bundle RepositoryFactory in favor of Repository's one * Combined Bundle and core RepositoryFactory into one * [Tests] Added needed RepositoryFactory configuration to test setup * [PHPStan] Introduced role policy map array shape as TPolicyMap * [PHPStan] Aligned baseline after the changes
1 parent e71f77b commit ccbbab2

File tree

9 files changed

+106
-85
lines changed

9 files changed

+106
-85
lines changed

src/bundle/Core/ApiLoader/RepositoryFactory.php

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,23 @@
2525
use Ibexa\Core\Repository\Mapper;
2626
use Ibexa\Core\Repository\Permission\LimitationService;
2727
use Ibexa\Core\Repository\ProxyFactory\ProxyDomainMapperFactoryInterface;
28+
use Ibexa\Core\Repository\Repository as CoreRepository;
2829
use Ibexa\Core\Repository\User\PasswordValidatorInterface;
2930
use Ibexa\Core\Search\Common\BackgroundIndexer;
3031
use Psr\Log\LoggerInterface;
3132
use Psr\Log\NullLogger;
32-
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
33-
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
3433

35-
class RepositoryFactory implements ContainerAwareInterface
34+
/**
35+
* @internal
36+
*
37+
* @deprecated 5.0.0 The "\Ibexa\Bundle\Core\ApiLoader\RepositoryFactory" class is deprecated, will be removed in 6.0.
38+
* Use {@see \Ibexa\Core\Base\Container\ApiLoader\RepositoryFactory instead}.
39+
*/
40+
class RepositoryFactory
3641
{
37-
use ContainerAwareTrait;
38-
3942
/** @var \Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface */
4043
private $configResolver;
4144

42-
/** @var string */
43-
private $repositoryClass;
44-
4545
/**
4646
* Map of system configured policies.
4747
*
@@ -57,14 +57,12 @@ class RepositoryFactory implements ContainerAwareInterface
5757

5858
public function __construct(
5959
ConfigResolverInterface $configResolver,
60-
$repositoryClass,
6160
array $policyMap,
6261
LanguageResolver $languageResolver,
6362
private readonly RepositoryConfigurationProviderInterface $repositoryConfigurationProvider,
6463
LoggerInterface $logger = null
6564
) {
6665
$this->configResolver = $configResolver;
67-
$this->repositoryClass = $repositoryClass;
6866
$this->policyMap = $policyMap;
6967
$this->languageResolver = $languageResolver;
7068
$this->logger = $logger ?? new NullLogger();
@@ -100,7 +98,7 @@ public function buildRepository(
10098
): Repository {
10199
$config = $this->repositoryConfigurationProvider->getRepositoryConfig();
102100

103-
return new $this->repositoryClass(
101+
return new CoreRepository(
104102
$persistenceHandler,
105103
$searchHandler,
106104
$backgroundIndexer,

src/bundle/Core/Resources/config/papi.yml

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,16 @@ parameters:
1111
services:
1212
# API
1313
Ibexa\Bundle\Core\ApiLoader\RepositoryFactory:
14+
deprecated:
15+
package: 'ibexa/core'
16+
version: '5.0'
17+
message: 'Since ibexa/core 5.0: The "%service_id%" service is deprecated and will be removed in 6.0. Use Ibexa\Core\Base\Container\ApiLoader\RepositoryFactory instead'
1418
arguments:
15-
- '@ibexa.config.resolver'
16-
- Ibexa\Core\Repository\Repository
17-
- '%ibexa.api.role.policy_map%'
18-
- '@Ibexa\Contracts\Core\Repository\LanguageResolver'
19-
- '@Ibexa\Contracts\Core\Container\ApiLoader\RepositoryConfigurationProviderInterface'
20-
- "@?logger"
21-
calls:
22-
- [setContainer, ["@service_container"]]
19+
$configResolver: '@Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface'
20+
$policyMap: '%ibexa.api.role.policy_map%'
21+
$languageResolver: '@Ibexa\Contracts\Core\Repository\LanguageResolver'
22+
$repositoryConfigurationProvider: '@Ibexa\Contracts\Core\Container\ApiLoader\RepositoryConfigurationProviderInterface'
23+
$logger: "@?logger"
2324

2425
Ibexa\Bundle\Core\ApiLoader\StorageEngineFactory:
2526
arguments:

src/bundle/Core/Resources/config/storage_engines.yml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,4 @@
11
services:
2-
Ibexa\Contracts\Core\Container\ApiLoader\RepositoryConfigurationProviderInterface:
3-
alias: Ibexa\Core\Base\Container\ApiLoader\RepositoryConfigurationProvider
4-
5-
Ibexa\Core\Base\Container\ApiLoader\RepositoryConfigurationProvider:
6-
arguments:
7-
$configResolver: '@Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface'
8-
$repositories: '%ibexa.repositories%'
9-
102
Ibexa\Bundle\Core\ApiLoader\RepositoryConfigurationProvider:
113
deprecated:
124
package: 'ibexa/core'

src/contracts/Repository/RoleService.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323

2424
/**
2525
* This service provides methods for managing Roles and Policies.
26+
*
27+
* @phpstan-type TPolicyMap array<string, array<string, array<string, boolean|null>>>
2628
*/
2729
interface RoleService
2830
{

src/lib/Base/Container/ApiLoader/RepositoryFactory.php

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
namespace Ibexa\Core\Base\Container\ApiLoader;
99

10+
use Ibexa\Contracts\Core\Container\ApiLoader\RepositoryConfigurationProviderInterface;
1011
use Ibexa\Contracts\Core\Persistence\Filter\Content\Handler as ContentFilteringHandler;
1112
use Ibexa\Contracts\Core\Persistence\Filter\Location\Handler as LocationFilteringHandler;
1213
use Ibexa\Contracts\Core\Persistence\Handler as PersistenceHandler;
@@ -25,36 +26,40 @@
2526
use Ibexa\Core\Repository\Mapper;
2627
use Ibexa\Core\Repository\Permission\LimitationService;
2728
use Ibexa\Core\Repository\ProxyFactory\ProxyDomainMapperFactoryInterface;
29+
use Ibexa\Core\Repository\Repository as CoreRepository;
2830
use Ibexa\Core\Repository\User\PasswordValidatorInterface;
2931
use Ibexa\Core\Search\Common\BackgroundIndexer;
30-
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
31-
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
32+
use Psr\Log\LoggerAwareInterface;
33+
use Psr\Log\LoggerAwareTrait;
34+
use Psr\Log\NullLogger;
3235

33-
class RepositoryFactory implements ContainerAwareInterface
36+
/**
37+
* @internal
38+
*
39+
* @phpstan-import-type TPolicyMap from \Ibexa\Contracts\Core\Repository\RoleService
40+
*/
41+
final class RepositoryFactory implements LoggerAwareInterface
3442
{
35-
use ContainerAwareTrait;
43+
use LoggerAwareTrait;
3644

37-
/** @var string */
38-
private $repositoryClass;
45+
/** @phpstan-var TPolicyMap */
46+
private array $policyMap;
3947

40-
/**
41-
* Policies map.
42-
*
43-
* @var array
44-
*/
45-
protected $policyMap = [];
48+
private LanguageResolver $languageResolver;
4649

47-
/** @var \Ibexa\Contracts\Core\Repository\LanguageResolver */
48-
private $languageResolver;
50+
private RepositoryConfigurationProviderInterface $repositoryConfigurationProvider;
4951

52+
/**
53+
* @phpstan-param TPolicyMap $policyMap
54+
*/
5055
public function __construct(
51-
$repositoryClass,
5256
array $policyMap,
53-
LanguageResolver $languageResolver
57+
LanguageResolver $languageResolver,
58+
RepositoryConfigurationProviderInterface $repositoryConfigurationProvider
5459
) {
55-
$this->repositoryClass = $repositoryClass;
5660
$this->policyMap = $policyMap;
5761
$this->languageResolver = $languageResolver;
62+
$this->repositoryConfigurationProvider = $repositoryConfigurationProvider;
5863
}
5964

6065
/**
@@ -63,7 +68,7 @@ public function __construct(
6368
* This always returns the true inner Repository, please depend on ezpublish.api.repository and not this method
6469
* directly to make sure you get an instance wrapped inside Event / Cache / * functionality.
6570
*
66-
* @param string[] $languages
71+
* @throws \Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException
6772
*/
6873
public function buildRepository(
6974
PersistenceHandler $persistenceHandler,
@@ -85,10 +90,11 @@ public function buildRepository(
8590
LocationFilteringHandler $locationFilteringHandler,
8691
PasswordValidatorInterface $passwordValidator,
8792
ConfigResolverInterface $configResolver,
88-
NameSchemaServiceInterface $nameSchemaService,
89-
array $languages
93+
NameSchemaServiceInterface $nameSchemaService
9094
): Repository {
91-
return new $this->repositoryClass(
95+
$config = $this->repositoryConfigurationProvider->getRepositoryConfig();
96+
97+
return new CoreRepository(
9298
$persistenceHandler,
9399
$searchHandler,
94100
$backgroundIndexer,
@@ -114,8 +120,13 @@ public function buildRepository(
114120
'role' => [
115121
'policyMap' => $this->policyMap,
116122
],
117-
'languages' => $languages,
123+
'languages' => $configResolver->getParameter('languages'),
124+
'content' => [
125+
'default_version_archive_limit' => $config['options']['default_version_archive_limit'],
126+
'remove_archived_versions_on_publish' => $config['options']['remove_archived_versions_on_publish'],
127+
],
118128
],
129+
$this->logger ?? new NullLogger()
119130
);
120131
}
121132

src/lib/Repository/RoleService.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242

4343
/**
4444
* This service provides methods for managing Roles and Policies.
45+
*
46+
* @phpstan-import-type TPolicyMap from \Ibexa\Contracts\Core\Repository\RoleService
4547
*/
4648
class RoleService implements RoleServiceInterface
4749
{
@@ -57,20 +59,16 @@ class RoleService implements RoleServiceInterface
5759
/** @var \Ibexa\Core\Repository\Mapper\RoleDomainMapper */
5860
protected $roleDomainMapper;
5961

60-
/** @var array */
61-
protected $settings;
62+
/** @phpstan-var array{policyMap: TPolicyMap}|array{} */
63+
protected array $settings;
6264

6365
/** @var \Ibexa\Contracts\Core\Repository\PermissionResolver */
6466
private $permissionResolver;
6567

6668
/**
6769
* Setups service with reference to repository object that created it & corresponding handler.
6870
*
69-
* @param \Ibexa\Contracts\Core\Repository\Repository $repository
70-
* @param \Ibexa\Contracts\Core\Persistence\User\Handler $userHandler
71-
* @param \Ibexa\Core\Repository\Permission\LimitationService $limitationService
72-
* @param \Ibexa\Core\Repository\Mapper\RoleDomainMapper $roleDomainMapper
73-
* @param array $settings
71+
* @phpstan-param array{policyMap: TPolicyMap}|array{} $settings
7472
*/
7573
public function __construct(
7674
RepositoryInterface $repository,

src/lib/Resources/settings/repository/autowire.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
services:
2+
Ibexa\Contracts\Core\Container\ApiLoader\RepositoryConfigurationProviderInterface: '@Ibexa\Core\Base\Container\ApiLoader\RepositoryConfigurationProvider'
3+
24
Ibexa\Contracts\Core\Repository\Repository: '@ibexa.api.repository'
35

46
Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface: '@ibexa.config.resolver'

src/lib/Resources/settings/repository/inner.yml

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,40 @@ parameters:
66

77
# intentionally defined class parameter to be used by the Repository Factory
88
services:
9-
Ibexa\Bundle\Core\ApiLoader\RepositoryFactory:
10-
class: Ibexa\Core\Base\Container\ApiLoader\RepositoryFactory
9+
Ibexa\Core\Base\Container\ApiLoader\RepositoryConfigurationProvider:
1110
arguments:
12-
- Ibexa\Core\Repository\Repository
13-
- '%ibexa.api.role.policy_map%'
14-
- '@Ibexa\Contracts\Core\Repository\LanguageResolver'
15-
calls:
16-
- [setContainer, ["@service_container"]]
11+
$configResolver: '@Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface'
12+
$repositories: '%ibexa.repositories%'
13+
14+
Ibexa\Core\Base\Container\ApiLoader\RepositoryFactory:
15+
arguments:
16+
$policyMap: '%ibexa.api.role.policy_map%'
17+
$languageResolver: '@Ibexa\Contracts\Core\Repository\LanguageResolver'
18+
$repositoryConfigurationProvider: '@Ibexa\Contracts\Core\Container\ApiLoader\RepositoryConfigurationProviderInterface'
1719

1820
Ibexa\Core\Repository\Repository:
19-
factory: ['@Ibexa\Bundle\Core\ApiLoader\RepositoryFactory', buildRepository]
21+
factory: ['@Ibexa\Core\Base\Container\ApiLoader\RepositoryFactory', buildRepository]
2022
arguments:
21-
- '@ibexa.api.persistence_handler'
22-
- '@ibexa.spi.search'
23-
- '@Ibexa\Bundle\Core\EventListener\BackgroundIndexingTerminateListener'
24-
- '@Ibexa\Core\Repository\Helper\RelationProcessor'
25-
- '@Ibexa\Core\FieldType\FieldTypeRegistry'
26-
- '@Ibexa\Core\Repository\User\PasswordHashService'
27-
- '@Ibexa\Core\Repository\Strategy\ContentThumbnail\ThumbnailChainStrategy'
28-
- '@Ibexa\Core\Repository\ProxyFactory\ProxyDomainMapperFactory'
29-
- '@Ibexa\Core\Repository\Mapper\ContentDomainMapper'
30-
- '@Ibexa\Core\Repository\Mapper\ContentTypeDomainMapper'
31-
- '@Ibexa\Core\Repository\Mapper\RoleDomainMapper'
32-
- '@Ibexa\Core\Repository\Mapper\ContentMapper'
33-
- '@Ibexa\Contracts\Core\Repository\Validator\ContentValidator'
34-
- '@Ibexa\Core\Repository\Permission\LimitationService'
35-
- '@Ibexa\Contracts\Core\Repository\PermissionService'
36-
- '@Ibexa\Contracts\Core\Persistence\Filter\Content\Handler'
37-
- '@Ibexa\Contracts\Core\Persistence\Filter\Location\Handler'
38-
- '@Ibexa\Core\Repository\User\PasswordValidatorInterface'
39-
- '@ibexa.config.resolver'
40-
- '@Ibexa\Contracts\Core\Repository\NameSchema\NameSchemaServiceInterface'
41-
- '%languages%'
23+
$persistenceHandler: '@ibexa.api.persistence_handler'
24+
$searchHandler: '@ibexa.spi.search'
25+
$backgroundIndexer: '@Ibexa\Bundle\Core\EventListener\BackgroundIndexingTerminateListener'
26+
$relationProcessor: '@Ibexa\Core\Repository\Helper\RelationProcessor'
27+
$fieldTypeRegistry: '@Ibexa\Core\FieldType\FieldTypeRegistry'
28+
$passwordHashService: '@Ibexa\Core\Repository\User\PasswordHashService'
29+
$thumbnailStrategy: '@Ibexa\Core\Repository\Strategy\ContentThumbnail\ThumbnailChainStrategy'
30+
$proxyDomainMapperFactory: '@Ibexa\Core\Repository\ProxyFactory\ProxyDomainMapperFactory'
31+
$contentDomainMapper: '@Ibexa\Core\Repository\Mapper\ContentDomainMapper'
32+
$contentTypeDomainMapper: '@Ibexa\Core\Repository\Mapper\ContentTypeDomainMapper'
33+
$roleDomainMapper: '@Ibexa\Core\Repository\Mapper\RoleDomainMapper'
34+
$contentMapper: '@Ibexa\Core\Repository\Mapper\ContentMapper'
35+
$contentValidator: '@Ibexa\Contracts\Core\Repository\Validator\ContentValidator'
36+
$limitationService: '@Ibexa\Core\Repository\Permission\LimitationService'
37+
$permissionService: '@Ibexa\Contracts\Core\Repository\PermissionService'
38+
$contentFilteringHandler: '@Ibexa\Contracts\Core\Persistence\Filter\Content\Handler'
39+
$locationFilteringHandler: '@Ibexa\Contracts\Core\Persistence\Filter\Location\Handler'
40+
$passwordValidator: '@Ibexa\Core\Repository\User\PasswordValidatorInterface'
41+
$configResolver: '@Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface'
42+
$nameSchemaService: '@Ibexa\Contracts\Core\Repository\NameSchema\NameSchemaServiceInterface'
4243

4344
Ibexa\Core\Repository\ContentService:
4445
class: Ibexa\Core\Repository\ContentService

tests/integration/Core/Resources/settings/integration_legacy.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,22 @@ parameters:
1414

1515
ibexa.site_access.config.default.user_content_type_identifier: ['user']
1616

17+
ibexa.repositories:
18+
default:
19+
storage: ~
20+
search:
21+
engine: '%env(SEARCH_ENGINE)%'
22+
connection: default
23+
fields_groups:
24+
list: [content, metadata]
25+
default: content
26+
options:
27+
default_version_archive_limit: 5
28+
remove_archived_versions_on_publish: true
29+
30+
ibexa.site_access.config.default.repository: default
31+
ibexa.site_access.config.default.languages: '%languages%'
32+
1733
services:
1834
Ibexa\Core\FieldType\ImageAsset\AssetMapper:
1935
arguments:

0 commit comments

Comments
 (0)