Services API
New in version 13.1.5
The new service architecture replaces legacy controllers with a clean pipeline: Parser → Resolver → Renderer.
The RTE CKEditor Image extension uses a three-service architecture following TYPO3 v13 best practices with clear separation of concerns.
Table of contents
Architecture overview
ImageAttributeParser
- class ImageAttributeParser
-
- Fully qualified name
-
\Netresearch\
Rte CKEditor Image\ Service\ Image Attribute Parser
Pure HTML parsing using
DOMDocument- no business logic.
Responsibility
- Extract raw attributes from HTML strings.
- Parse
<img>tags within content. - Parse
<a>tags containing<img>tags. - NO validation, NO sanitization - just parsing.
Methods
parseImageAttributes()
- parseImageAttributes ( $html)
-
Parse attributes from
<img>tag HTML string.- param string $html
-
HTML string containing
<img>tag. - returntype
-
array<string,string>
- Returns
-
Attribute name => value pairs.
Example:
$parser = GeneralUtility::makeInstance(ImageAttributeParser::class);
$attributes = $parser->parseImageAttributes(
'<img src="image.jpg" data-htmlarea-file-uid="123" alt="Example" />'
);
// Returns: ['src' => 'image.jpg', 'data-htmlarea-file-uid' => '123', 'alt' => 'Example']
parseLinkWithImages()
- parseLinkWithImages ( $html)
-
Parse attributes from
<a>tag containing<img>tags.- param string $html
-
HTML string containing
<a><img /></.a> - returntype
-
array{link: array<string,string>, images: array}
- Returns
-
Array with
linkandimageskeys.
Return structure:
[
'link' => ['href' => 'page.html', 'title' => 'Link title'],
'images' => [
[
'attributes' => ['src' => 'image.jpg', 'alt' => 'Alt text'],
'originalHtml' => '<img src="image.jpg" alt="Alt text" />'
]
]
]
ImageResolverService
- class ImageResolverService
-
- Fully qualified name
-
\Netresearch\
Rte CKEditor Image\ Service\ Image Resolver Service
Business logic, security validation, and FAL processing.
Responsibility
- Transform raw attributes into validated DTOs.
- Resolve FAL file references.
- Apply security checks (file visibility, protocol blocking).
- Process images with quality settings.
- ALL security validation happens here.
Security features
New in version 13.1.5
The service includes comprehensive security measures:
- File visibility validation: Prevents access to hidden/restricted files.
- Protocol blocking: Blocks dangerous protocols (
javascript:,file:,data:,text/ html vbscript:). - XSS prevention: Uses
htmlspecialcharswith() ENT_.QUOTES | ENT_ HTML5 - Type safety: Read-only DTO properties prevent modification.
Quality settings
New in version 13.1.5
The service supports quality multipliers for image processing:
const QUALITY_NONE = 'none'; // N/A - Skip processing entirely
const QUALITY_LOW = 'low'; // 0.9x - Performance optimized
const QUALITY_STANDARD = 'standard'; // 1.0x - Default
const QUALITY_RETINA = 'retina'; // 2.0x - High-DPI displays
const QUALITY_ULTRA = 'ultra'; // 3.0x - Extra sharp
const QUALITY_PRINT = 'print'; // 6.0x - Print quality
Methods
resolve()
- resolve ( $attributes, $conf, $request, $linkAttributes = null)
-
Resolve image attributes to validated DTO.
- param array $attributes
-
Raw attributes from parser.
- param array $conf
-
TypoScript configuration.
- param ServerRequestInterface $request
-
Current request.
- param array|null $linkAttributes
-
Optional link attributes for linked images.
- returntype
-
ImageRenderingDto|null
- Returns
-
Validated DTO or null if validation fails.
Example:
$resolver = GeneralUtility::makeInstance(ImageResolverService::class);
$dto = $resolver->resolve(
$attributes,
$typoScriptConfig,
$request
);
if ($dto === null) {
// Validation failed - return original content
return $content;
}
ImageRenderingService
- class ImageRenderingService
-
- Fully qualified name
-
\Netresearch\
Rte CKEditor Image\ Service\ Image Rendering Service
Presentation layer using TYPO3 v13
View.Factory Interface
Responsibility
- Render validated DTOs via Fluid templates.
- Select appropriate template based on context.
- NO business logic, NO validation - trusts the DTO.
Template selection
The service automatically selects templates based on the rendering context:
| Context | Template |
|---|---|
| Standalone image | Image/ |
| Image with caption | Image/ |
| Image within link | Image/ |
| Linked image with caption | Image/ |
| Image with zoom/popup | Image/ |
| Popup image with caption | Image/ |
Methods
render()
- render ( ImageRenderingDto $imageData, ServerRequestInterface $request) : string
-
Render image HTML from validated DTO.
- param ImageRenderingDto $imageData
-
Validated image data.
- param ServerRequestInterface $request
-
Current request.
- returntype
-
string
- Returns
-
Rendered HTML.
Example:
$renderer = GeneralUtility::makeInstance(ImageRenderingService::class);
$html = $renderer->render($dto, $request);
Service decoration
To customize service behavior, use Symfony service decoration:
App\Service\CustomImageResolver:
decorates: Netresearch\RteCKEditorImage\Service\ImageResolverService
arguments:
$inner: '@.inner'
<?php
declare(strict_types=1);
namespace App\Service;
use Netresearch\RteCKEditorImage\Service\ImageResolverService;
use Netresearch\RteCKEditorImage\Domain\Model\ImageRenderingDto;
class CustomImageResolver
{
public function __construct(
private readonly ImageResolverService $inner
) {}
public function resolve(...$args): ?ImageRenderingDto
{
// Custom pre-processing
$dto = $this->inner->resolve(...$args);
// Custom post-processing
return $dto;
}
}