Skip to content

Commit

Permalink
[TASK] Implement ContentBlocks cache
Browse files Browse the repository at this point in the history
The whole ContentBlockDefinitionCollection object is now
cached.
  • Loading branch information
nhovratov committed Feb 9, 2024
1 parent 9ac35a6 commit f4eef35
Show file tree
Hide file tree
Showing 16 changed files with 1,333 additions and 1,075 deletions.
2 changes: 1 addition & 1 deletion Classes/Builder/ContentBlockBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public function create(LoadedContentBlock $contentBlock): void
protected function initializeRegistries(LoadedContentBlock $contentBlock): void
{
$this->contentBlockRegistry->register($contentBlock);
$tableDefinitionCollection = $this->tableDefinitionCollectionFactory->createUncached();
$tableDefinitionCollection = $this->tableDefinitionCollectionFactory->createUncached($this->contentBlockRegistry);
$automaticLanguageKeysRegistry = $tableDefinitionCollection->getAutomaticLanguageKeysRegistry();
$this->languageFileGenerator->setAutomaticLanguageKeysRegistry($automaticLanguageKeysRegistry);
}
Expand Down
47 changes: 47 additions & 0 deletions Classes/Definition/Factory/CompilationResult.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

declare(strict_types=1);

/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/

namespace TYPO3\CMS\ContentBlocks\Definition\Factory;

use TYPO3\CMS\ContentBlocks\Registry\AutomaticLanguageKeysRegistry;

final class CompilationResult
{
public function __construct(
private readonly AutomaticLanguageKeysRegistry $automaticLanguageKeys,
/**
* @var array<string, array>
*/
private readonly array $parentReferences,
private readonly array $mergedTableDefinitions,
) {}

public function getAutomaticLanguageKeys(): AutomaticLanguageKeysRegistry
{
return $this->automaticLanguageKeys;
}

public function getParentReferences(): array
{
return $this->parentReferences;
}

public function getMergedTableDefinitions(): array
{
return $this->mergedTableDefinitions;
}
}
998 changes: 998 additions & 0 deletions Classes/Definition/Factory/ContentBlockCompiler.php

Large diffs are not rendered by default.

34 changes: 34 additions & 0 deletions Classes/Definition/Factory/InitializeContentBlockCache.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

declare(strict_types=1);

/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/

namespace TYPO3\CMS\ContentBlocks\Definition\Factory;

/**
* The Content Blocks cache is lazy and needs to be initialized
* as soon as bootstrapping is complete.
*/
class InitializeContentBlockCache
{
public function __construct(
protected readonly TableDefinitionCollectionFactory $tableDefinitionCollectionFactory
) {}

public function __invoke(): void
{
$this->tableDefinitionCollectionFactory->initializeCache();
}
}
1,019 changes: 37 additions & 982 deletions Classes/Definition/Factory/TableDefinitionCollectionFactory.php

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions Classes/Generator/SqlGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@
class SqlGenerator
{
public function __construct(
protected readonly ContentBlockLoader $contentBlockLoader
protected readonly ContentBlockLoader $contentBlockLoader,
protected readonly TableDefinitionCollectionFactory $tableDefinitionCollectionFactory,
) {}

public function __invoke(AlterTableDefinitionStatementsEvent $event): void
Expand All @@ -41,8 +42,7 @@ public function __invoke(AlterTableDefinitionStatementsEvent $event): void
public function generate(): array
{
$contentBlockRegistry = $this->contentBlockLoader->loadUncached();
$tableDefinitionFactory = new TableDefinitionCollectionFactory($contentBlockRegistry);
$tableDefinitionCollection = $tableDefinitionFactory->create();
$tableDefinitionCollection = $this->tableDefinitionCollectionFactory->createUncached($contentBlockRegistry);
$sql = [];
foreach ($tableDefinitionCollection as $tableDefinition) {
foreach ($tableDefinition->getSqlColumnDefinitionCollection() as $column) {
Expand Down
21 changes: 7 additions & 14 deletions Classes/ServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
use TYPO3\CMS\ContentBlocks\Definition\ContentType\ContentElementDefinition;
use TYPO3\CMS\ContentBlocks\Definition\ContentType\ContentType;
use TYPO3\CMS\ContentBlocks\Definition\ContentType\PageTypeDefinition;
use TYPO3\CMS\ContentBlocks\Definition\Factory\TableDefinitionCollectionFactory;
use TYPO3\CMS\ContentBlocks\Definition\TableDefinitionCollection;
use TYPO3\CMS\ContentBlocks\Generator\PageTsConfigGenerator;
use TYPO3\CMS\ContentBlocks\Generator\TypoScriptGenerator;
use TYPO3\CMS\ContentBlocks\Generator\UserTsConfigGenerator;
Expand Down Expand Up @@ -142,8 +142,7 @@ public static function getContentWhere(ContainerInterface $container): ContentWh
public static function getContentBlockIcons(ContainerInterface $container): \ArrayObject
{
$arrayObject = new \ArrayObject();
$tableDefinitionCollectionFactory = $container->get(TableDefinitionCollectionFactory::class);
$tableDefinitionCollection = $tableDefinitionCollectionFactory->create();
$tableDefinitionCollection = $container->get(TableDefinitionCollection::class);
foreach ($tableDefinitionCollection as $tableDefinition) {
foreach ($tableDefinition->getContentTypeDefinitionCollection() ?? [] as $typeDefinition) {
$iconConfig = [
Expand All @@ -161,8 +160,7 @@ public static function getContentBlockIcons(ContainerInterface $container): \Arr
public static function getContentBlockPageTypes(ContainerInterface $container): \ArrayObject
{
$arrayObject = new \ArrayObject();
$tableDefinitionCollectionFactory = $container->get(TableDefinitionCollectionFactory::class);
$tableDefinitionCollection = $tableDefinitionCollectionFactory->create();
$tableDefinitionCollection = $container->get(TableDefinitionCollection::class);
if (!$tableDefinitionCollection->hasTable(ContentType::PAGE_TYPE->getTable())) {
return $arrayObject;
}
Expand All @@ -183,9 +181,8 @@ public static function getContentBlockTypoScript(ContainerInterface $container):
return $arrayObject;
}

$tableDefinitionCollectionFactory = $container->get(TableDefinitionCollectionFactory::class);
$contentBlockRegistry = $container->get(ContentBlockRegistry::class);
$tableDefinitionCollection = $tableDefinitionCollectionFactory->create();
$tableDefinitionCollection = $container->get(TableDefinitionCollection::class);
foreach ($tableDefinitionCollection as $tableDefinition) {
foreach ($tableDefinition->getContentTypeDefinitionCollection() ?? [] as $typeDefinition) {
if ($tableDefinition->getContentType() === ContentType::CONTENT_ELEMENT) {
Expand Down Expand Up @@ -225,8 +222,7 @@ public static function getContentBlockUserTsConfig(ContainerInterface $container
return $arrayObject;
}

$tableDefinitionCollectionFactory = $container->get(TableDefinitionCollectionFactory::class);
$tableDefinitionCollection = $tableDefinitionCollectionFactory->create();
$tableDefinitionCollection = $container->get(TableDefinitionCollection::class);
foreach ($tableDefinitionCollection as $tableDefinition) {
foreach ($tableDefinition->getContentTypeDefinitionCollection() ?? [] as $typeDefinition) {
if ($typeDefinition instanceof PageTypeDefinition) {
Expand All @@ -251,8 +247,7 @@ public static function getContentBlockPageTsConfig(ContainerInterface $container
}

$languageFileRegistry = $container->get(LanguageFileRegistry::class);
$tableDefinitionCollectionFactory = $container->get(TableDefinitionCollectionFactory::class);
$tableDefinitionCollection = $tableDefinitionCollectionFactory->create();
$tableDefinitionCollection = $container->get(TableDefinitionCollection::class);
foreach ($tableDefinitionCollection as $tableDefinition) {
foreach ($tableDefinition->getContentTypeDefinitionCollection() ?? [] as $typeDefinition) {
if ($typeDefinition instanceof ContentElementDefinition) {
Expand Down Expand Up @@ -307,9 +302,7 @@ public static function getContentBlockParentFieldNames(ContainerInterface $conta
return $arrayObject;
}

$tableDefinitionCollectionFactory = $container->get(TableDefinitionCollectionFactory::class);
$tableDefinitionCollection = $tableDefinitionCollectionFactory->create();

$tableDefinitionCollection = $container->get(TableDefinitionCollection::class);
$contentElementTable = ContentType::CONTENT_ELEMENT->getTable();
if ($tableDefinitionCollection->hasTable($contentElementTable)) {
$fieldNames = [];
Expand Down
20 changes: 20 additions & 0 deletions Configuration/Services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ services:
resource: '../Classes/UserFunction/*'
public: true

TYPO3\CMS\ContentBlocks\Definition\Factory\InitializeContentBlockCache:
tags:
- name: event.listener
identifier: 'content-blocks-initialize-cache'
event: TYPO3\CMS\Core\Core\Event\BootCompletedEvent

# @todo change to BeforeTcaOverridesEvent for v13
TYPO3\CMS\ContentBlocks\Generator\TcaGenerator:
public: true
Expand All @@ -25,6 +31,7 @@ services:
- name: event.listener
identifier: 'content-blocks-typoscript'
event: TYPO3\CMS\Core\Core\Event\BootCompletedEvent
after: 'content-blocks-initialize-cache'

# @todo Use BeforeLoadedPageTsConfigEvent in v13
TYPO3\CMS\ContentBlocks\Generator\PageTsConfigGenerator:
Expand All @@ -41,6 +48,7 @@ services:
- name: event.listener
identifier: 'content-blocks-user-tsconfig'
event: TYPO3\CMS\Core\Core\Event\BootCompletedEvent
after: 'content-blocks-initialize-cache'

TYPO3\CMS\ContentBlocks\Generator\SqlGenerator:
public: true
Expand Down Expand Up @@ -77,10 +85,22 @@ services:
arguments:
$cache: '@cache.core'

cache.content_blocks:
class: TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
factory: ['@TYPO3\CMS\Core\Cache\CacheManager', 'getCache']
arguments: ['content_blocks']
lazy: true

TYPO3\CMS\ContentBlocks\Definition\Factory\TableDefinitionCollectionFactory:
arguments:
$cache: '@cache.content_blocks'

TYPO3\CMS\ContentBlocks\Definition\TableDefinitionCollection:
public: true
factory:
- '@TYPO3\CMS\ContentBlocks\Definition\Factory\TableDefinitionCollectionFactory'
- 'create'
arguments: ['@TYPO3\CMS\ContentBlocks\Registry\ContentBlockRegistry']

TYPO3\CMS\ContentBlocks\Registry\ContentBlockRegistry:
public: true
Expand Down
Loading

0 comments on commit f4eef35

Please sign in to comment.