.. include:: /Includes.rst.txt .. _api-services: ============ Services API ============ .. versionadded:: 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. .. contents:: Table of contents :depth: 3 :local: Architecture overview ===================== .. uml:: :caption: Service pipeline architecture skinparam componentStyle rectangle skinparam backgroundColor white component "ImageAttributeParser" as Parser component "ImageResolverService" as Resolver component "ImageRenderingService" as Renderer component "Rendered HTML" as Output note right of Parser HTML Parsing DOMDocument Attribute extraction end note note right of Resolver Business Logic Security Validation FAL Processing end note note right of Renderer Fluid Rendering ViewFactoryInterface Template Selection end note Parser --> Resolver : Raw attributes Resolver --> Renderer : ImageRenderingDto Renderer --> Output ImageAttributeParser ==================== .. _api-imageattributeparser: .. php:class:: Netresearch\RteCKEditorImage\Service\ImageAttributeParser Pure HTML parsing using :php:`DOMDocument` - no business logic. Responsibility -------------- - Extract raw attributes from HTML strings. - Parse :html:`` tags within content. - Parse :html:`` tags containing :html:`` tags. - **NO** validation, **NO** sanitization - just parsing. Methods ------- parseImageAttributes() ~~~~~~~~~~~~~~~~~~~~~~ .. php:method:: parseImageAttributes($html) Parse attributes from :html:`` tag HTML string. :param string $html: HTML string containing :html:`` tag. :returns: Attribute name => value pairs. :returntype: array **Example:** .. code-block:: php :caption: Parsing image attributes $parser = GeneralUtility::makeInstance(ImageAttributeParser::class); $attributes = $parser->parseImageAttributes( 'Example' ); // Returns: ['src' => 'image.jpg', 'data-htmlarea-file-uid' => '123', 'alt' => 'Example'] parseLinkWithImages() ~~~~~~~~~~~~~~~~~~~~~ .. php:method:: parseLinkWithImages($html) Parse attributes from :html:`` tag containing :html:`` tags. :param string $html: HTML string containing :html:``. :returns: Array with `link` and `images` keys. :returntype: array{link: array, images: array} **Return structure:** .. code-block:: php :caption: Return value structure [ 'link' => ['href' => 'page.html', 'title' => 'Link title'], 'images' => [ [ 'attributes' => ['src' => 'image.jpg', 'alt' => 'Alt text'], 'originalHtml' => 'Alt text' ] ] ] ImageResolverService ==================== .. _api-imageresolverservice: .. php:class:: Netresearch\RteCKEditorImage\Service\ImageResolverService 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 ----------------- .. versionadded:: 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 :php:`htmlspecialchars()` with :php:`ENT_QUOTES | ENT_HTML5`. - **Type safety**: Read-only DTO properties prevent modification. Quality settings ---------------- .. versionadded:: 13.1.5 The service supports quality multipliers for image processing: .. code-block:: php :caption: Quality constants in ImageResolverService 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() ~~~~~~~~~ .. php:method:: 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. :returns: Validated DTO or null if validation fails. :returntype: ImageRenderingDto|null **Example:** .. code-block:: php :caption: Resolving image attributes to DTO $resolver = GeneralUtility::makeInstance(ImageResolverService::class); $dto = $resolver->resolve( $attributes, $typoScriptConfig, $request ); if ($dto === null) { // Validation failed - return original content return $content; } ImageRenderingService ===================== .. _api-imagerenderingservice: .. php:class:: Netresearch\RteCKEditorImage\Service\ImageRenderingService Presentation layer using TYPO3 v13 :php:`ViewFactoryInterface`. 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: .. list-table:: Template selection matrix :header-rows: 1 :widths: 50 50 * - Context - Template * - Standalone image - :file:`Image/Standalone` * - Image with caption - :file:`Image/WithCaption` * - Image within link - :file:`Image/Link` * - Linked image with caption - :file:`Image/LinkWithCaption` * - Image with zoom/popup - :file:`Image/Popup` * - Popup image with caption - :file:`Image/PopupWithCaption` Methods ------- render() ~~~~~~~~ .. php:method:: render(ImageRenderingDto $imageData, ServerRequestInterface $request): string Render image HTML from validated DTO. :param ImageRenderingDto $imageData: Validated image data. :param ServerRequestInterface $request: Current request. :returns: Rendered HTML. :returntype: string **Example:** .. code-block:: php :caption: Rendering image from DTO $renderer = GeneralUtility::makeInstance(ImageRenderingService::class); $html = $renderer->render($dto, $request); Service decoration ================== To customize service behavior, use Symfony service decoration: .. code-block:: yaml :caption: EXT:my_extension/Configuration/Services.yaml App\Service\CustomImageResolver: decorates: Netresearch\RteCKEditorImage\Service\ImageResolverService arguments: $inner: '@.inner' .. code-block:: php :caption: EXT:my_extension/Classes/Service/CustomImageResolver.php inner->resolve(...$args); // Custom post-processing return $dto; } } Related documentation ===================== - :ref:`DTOs ` - Data transfer objects. - :ref:`Controllers API ` - TypoScript adapter. - :ref:`Template Overrides ` - Customizing output.