---
title: "Developer reference"
manual: "Image Optimization for TYPO3"
version: "1.6"
permalink: "https://docs.typo3.org/permalink/netresearch/nr-image-optimize:developer@1.6"
source: "Developer/Index.rst"
rendered: "2026-09-25T10:18:05+00:00"
---

# Developer reference {#developer}

## Architecture {#developer-architecture}

The extension has three entry points that share the same
`ImageOptimizer` service where applicable:

1.  **ProcessingMiddleware** intercepts frontend requests
    matching the `/processed/` path and delegates to
    **Processor**, which handles image optimization, format
    conversion, and caching.
1.  **OptimizeOnUploadListener** reacts to PSR-14 file events
    (`AfterFileAddedEvent` and `AfterFileReplacedEvent`)
    and delegates to **ImageOptimizer** for in-place lossless
    compression via `optipng`/`gifsicle`/`jpegoptim`.
1.  **OptimizeImagesCommand** and **AnalyzeImagesCommand**
    iterate the FAL index from the CLI, extending
    **AbstractImageCommand** for shared iteration and option
    parsing. See [Usage](https://docs.typo3.org/permalink/netresearch/nr-image-optimize:usage-cli@1.6).

**SourceSetViewHelper** generates responsive `<img>` markup
in Fluid templates. **MaintenanceController** provides the
backend module for statistics and cleanup.

## Directory structure {#developer-directory-structure}

-   Classes/
    -   Command/
        -   AbstractImageCommand.php
        -   AnalyzeImagesCommand.php
        -   OptimizeImagesCommand.php
    -   Controller/
        -   MaintenanceController.php
    -   EventListener/
        -   OptimizeOnUploadListener.php
    -   Middleware/
        -   ProcessingMiddleware.php
    -   Service/
        -   ImageOptimizer.php
        -   SystemRequirementsService.php
    -   Processor.php
    -   ViewHelpers/
        -   SourceSetViewHelper.php
-   Configuration/
    -   Backend/
        -   Modules.php
    -   Icons.php
    -   RequestMiddlewares.php
    -   Services.yaml

## Processing middleware {#developer-middleware}

-   **class ProcessingMiddleware**

    -   *Fully qualified name:* `\Netresearch\NrImageOptimize\Middleware\ProcessingMiddleware`

    Frontend middleware registered before
    `typo3/cms-frontend/site`. Intercepts requests whose
    path starts with `/processed/` and delegates image
    processing to the [Processor](https://docs.typo3.org/permalink/netresearch/nr-image-optimize:developer-processor@1.6) class.

## Processor {#developer-processor}

-   **class Processor**

    -   *Fully qualified name:* `\Netresearch\NrImageOptimize\Processor`

    Core image processing engine. Parses the requested URL
    to extract dimensions, quality, mode, and format
    parameters. Uses the Intervention Image library for
    actual image manipulation. Processed images are cached
    on disk to avoid repeated processing.

## SourceSetViewHelper {#developer-viewhelper}

-   **class SourceSetViewHelper**

    -   *Fully qualified name:* `\Netresearch\NrImageOptimize\ViewHelpers\SourceSetViewHelper`

    Fluid ViewHelper that generates `<img>` tags with
    `srcset` attributes for responsive image delivery.
    Supports both density-based (2x) and width-based
    responsive srcset modes.

## ImageOptimizer {#developer-image-optimizer}

-   **class ImageOptimizer**

    -   *Fully qualified name:* `\Netresearch\NrImageOptimize\Service\ImageOptimizer`

    Shared service that shells out to `optipng`,
    `gifsicle`, or `jpegoptim` (whichever is resolvable
    on the `$PATH`, or via the
    `OPTIPNG_BIN`/`GIFSICLE_BIN`/`JPEGOPTIM_BIN`
    environment variables) via `proc_open` with argument
    arrays. Used by both **OptimizeOnUploadListener** and
    **OptimizeImagesCommand**. A missing binary degrades
    gracefully -- that format is simply skipped.

## OptimizeOnUploadListener {#developer-event-listener}

-   **class OptimizeOnUploadListener**

    -   *Fully qualified name:* `\Netresearch\NrImageOptimize\EventListener\OptimizeOnUploadListener`

    PSR-14 listener for `AfterFileAddedEvent` and
    `AfterFileReplacedEvent`. Compresses newly
    uploaded/replaced files in place via
    [ImageOptimizer](https://docs.typo3.org/permalink/netresearch/nr-image-optimize:developer-image-optimizer@1.6),
    guarded against re-entrancy by storage UID + file
    identifier.

## Console commands {#developer-commands}

-   **class AbstractImageCommand**

    -   *Fully qualified name:* `\Netresearch\NrImageOptimize\Command\AbstractImageCommand`

    Shared template method for both commands below: storage
    UID parsing, FAL index iteration, and progress rendering.

-   **class OptimizeImagesCommand**

    -   *Fully qualified name:* `\Netresearch\NrImageOptimize\Command\OptimizeImagesCommand`

    Backs `nr:image:optimize`. See
    [Usage](https://docs.typo3.org/permalink/netresearch/nr-image-optimize:usage-cli-optimize@1.6).

-   **class AnalyzeImagesCommand**

    -   *Fully qualified name:* `\Netresearch\NrImageOptimize\Command\AnalyzeImagesCommand`

    Backs `nr:image:analyze`. See
    [Usage](https://docs.typo3.org/permalink/netresearch/nr-image-optimize:usage-cli-analyze@1.6).

## Testing {#developer-testing}

**Run the full test suite**

```bash
composer ci:test
```

Individual test commands:

**Available test commands**

```bash
composer ci:test:php:cgl      # Code style
composer ci:test:php:lint     # PHP syntax
composer ci:test:php:phpstan  # Static analysis
composer ci:test:php:unit     # PHPUnit tests
composer ci:test:php:rector   # Code quality
```
