TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:24 +02:00
commit aad9daaefd
1506 changed files with 94005 additions and 0 deletions
+186
View File
@@ -0,0 +1,186 @@
<?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\Form\Storage;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Form\Domain\DTO\FormData;
use TYPO3\CMS\Form\Domain\DTO\FormMetadata;
use TYPO3\CMS\Form\Domain\DTO\SearchCriteria;
use TYPO3\CMS\Form\Domain\DTO\StorageContext;
use TYPO3\CMS\Form\Domain\ValueObject\FormIdentifier;
use TYPO3\CMS\Form\Mvc\Persistence\Exception\NoUniquePersistenceIdentifierException;
use TYPO3\CMS\Form\Mvc\Persistence\Exception\PersistenceManagerException;
/**
* Storage adapter interface for form persistence
*
* Storage adapters are responsible for reading, writing, and finding form definitions
* from various storage backends (file mounts, extensions, database, etc.).
*
* Adapters are selected using the Chain of Responsibility pattern:
* - Each adapter declares what identifiers it can handle via supports()
* - Factory iterates through adapters by priority until one matches
* - This allows third-party extensions to register custom storage adapters
*
* @internal
*/
interface StorageAdapterInterface
{
/**
* Get the human-readable label for this storage type
*
* @return string translation key
*/
public function getLabel(): string;
/**
* Get the description for this storage type
*
* @return string translation key
*/
public function getDescription(): string;
/**
* Get the icon identifier for this storage type
*
* @return string icon identifier
*/
public function getIconIdentifier(): string;
/**
* Get unique identifier for this storage type
*
* Used for metadata, display, and debugging purposes.
* Examples: 'extension', 'filemount', 'database'
*
* @return string Unique type identifier (lowercase, alphanumeric + underscore)
*/
public function getTypeIdentifier(): string;
/**
* Check if this adapter can handle the given persistence identifier
*
* @param string $identifier Persistence identifier (e.g., "EXT:my_extension/Forms/contact.form.yaml", "1:/forms/contact.form.yaml")
* @return bool True if this adapter can handle the identifier
*/
public function supports(string $identifier): bool;
/**
* Get options for the form manager interface
*/
public function getFormManagerOptions(): array;
/**
* Check if this storage is currently accessible
*/
public function isAccessible(): bool;
/**
* Get priority for capability checking
*
* Higher priority adapters are checked first.
* Allows extensions to override core adapters by providing higher priority.
*
* Suggested ranges:
* - 0-49: Low priority / fallback adapters
* - 50-99: Normal priority (file mounts, database)
* - 100+: High priority (extension paths, specific handlers)
*
* @return int Priority (higher = checked first)
*/
public function getPriority(): int;
/**
* Read form definition from storage
*
* @throws \TYPO3\CMS\Form\Mvc\Persistence\Exception\PersistenceManagerException
*/
public function read(FormIdentifier $identifier, ?ServerRequestInterface $request = null): FormData;
/**
* Write form definition to storage
*
* @param StorageContext|null $context Additional storage context (e.g., PID for database storage)
* @return FormIdentifier The identifier of the saved form (might differ for new forms in database storage)
* @throws PersistenceManagerException
*/
public function write(FormIdentifier $identifier, FormData $data, ?StorageContext $context = null): FormIdentifier;
/**
* Delete form definition from storage
*
* @throws \TYPO3\CMS\Form\Mvc\Persistence\Exception\PersistenceManagerException
*/
public function delete(FormIdentifier $identifier): void;
/**
* Check if form definition exists in storage
*/
public function exists(FormIdentifier $identifier): bool;
/**
* Check if a form with the given form identifier (not persistence identifier) exists
*
* This is used for efficient duplicate identifier checking without loading all forms.
* The form identifier is the logical name (e.g., "contact-form"), not the persistence
* identifier (e.g., UID or file path).
*
* @param string $formIdentifier The form identifier to check (e.g., "contact-form")
* @return bool True if a form with this identifier exists in this storage
*/
public function existsByFormIdentifier(string $formIdentifier): bool;
/**
* Find all form definitions matching the search criteria
*
* @return array<FormMetadata>
*/
public function findAll(SearchCriteria $criteria): array;
/**
* Get unique persistence identifier for a new form in this storage
*
* @param string $formIdentifier The form identifier (e.g., "contact-form")
* @param string $storageLocation The save path (e.g., "1:/forms/" for filemount, pid for database)
* @return string Unique persistence identifier
* @throws NoUniquePersistenceIdentifierException
*/
public function getUniquePersistenceIdentifier(string $formIdentifier, string $storageLocation): string;
/**
* Check if a storage location is allowed for this adapter
*
* For database storage: storageLocation is a PID
* For file storage: storageLocation is a folder path (e.g., "1:/forms/")
*
* @param string $storageLocation The storage location to check
* @return bool True if the storage location is allowed
*/
public function isAllowedStorageLocation(string $storageLocation): bool;
/**
* Check if a persistence identifier is allowed for this adapter
*
* For database storage: identifier is a UID or NEW*
* For file storage: identifier is a full file path (e.g., "1:/forms/contact.form.yaml")
*
* @param string $persistenceIdentifier The persistence identifier to check
* @return bool True if the persistence identifier is allowed
*/
public function isAllowedPersistenceIdentifier(string $persistenceIdentifier): bool;
}