diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index de22585388..6cf3b7b003 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -7070,11 +7070,6 @@ parameters: count: 1 path: src/contracts/Repository/Validator/ContentValidator.php - - - message: "#^Method Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\Validator\\\\ContentValidator\\:\\:validate\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/contracts/Repository/Validator/ContentValidator.php - - message: "#^Class Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\Values\\\\Bookmark\\\\BookmarkList implements generic interface IteratorAggregate but does not specify its types\\: TKey, TValue$#" count: 1 @@ -7500,11 +7495,6 @@ parameters: count: 1 path: src/contracts/Repository/Values/ContentType/FieldDefinitionCollection.php - - - message: "#^Interface Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\Values\\\\ContentType\\\\FieldDefinitionCollection extends generic interface IteratorAggregate but does not specify its types\\: TKey, TValue$#" - count: 1 - path: src/contracts/Repository/Values/ContentType/FieldDefinitionCollection.php - - message: "#^Method Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\Values\\\\ContentType\\\\FieldDefinitionCollection\\:\\:map\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -8115,11 +8105,6 @@ parameters: count: 1 path: src/lib/Base/Exceptions/ContentFieldValidationException.php - - - message: "#^Parameter \\#2 \\$array of function implode expects array\\, array\\ given\\.$#" - count: 1 - path: src/lib/Base/Exceptions/ContentFieldValidationException.php - - message: "#^Property Ibexa\\\\Core\\\\Base\\\\Exceptions\\\\ContentFieldValidationException\\:\\:\\$messageTemplate has no type specified\\.$#" count: 1 @@ -20215,6 +20200,11 @@ parameters: count: 1 path: src/lib/Repository/ContentService.php + - + message: "#^Parameter \\#5 \\$fieldDefinitionId of method Ibexa\\\\Core\\\\Repository\\\\Helper\\\\RelationProcessor\\:\\:appendFieldRelations\\(\\) expects string, int given\\.$#" + count: 2 + path: src/lib/Repository/ContentService.php + - message: "#^Property Ibexa\\\\Contracts\\\\Core\\\\Persistence\\\\Content\\\\MetadataUpdateStruct\\:\\:\\$publicationDate \\(int\\) does not accept int\\|null\\.$#" count: 1 @@ -21405,11 +21395,6 @@ parameters: count: 1 path: src/lib/Repository/Strategy/ContentValidator/ContentValidatorStrategy.php - - - message: "#^Method Ibexa\\\\Core\\\\Repository\\\\Strategy\\\\ContentValidator\\\\ContentValidatorStrategy\\:\\:validate\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/lib/Repository/Strategy/ContentValidator/ContentValidatorStrategy.php - - message: "#^Property Ibexa\\\\Core\\\\Repository\\\\Strategy\\\\ContentValidator\\\\ContentValidatorStrategy\\:\\:\\$contentValidators \\(array\\\\) does not accept iterable\\.$#" count: 1 @@ -21620,11 +21605,6 @@ parameters: count: 1 path: src/lib/Repository/UserService.php - - - message: "#^Parameter \\#1 \\$errors of static method Ibexa\\\\Core\\\\Base\\\\Exceptions\\\\ContentFieldValidationException\\:\\:createNewWithMultiline\\(\\) expects array\\\\>, array\\\\>\\> given\\.$#" - count: 1 - path: src/lib/Repository/UserService.php - - message: "#^Parameter \\#1 \\$identifier of method Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\ContentTypeService\\:\\:loadContentTypeByIdentifier\\(\\) expects string, string\\|false given\\.$#" count: 2 @@ -21670,11 +21650,6 @@ parameters: count: 1 path: src/lib/Repository/Validator/ContentCreateStructValidator.php - - - message: "#^Method Ibexa\\\\Core\\\\Repository\\\\Validator\\\\ContentCreateStructValidator\\:\\:validate\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/lib/Repository/Validator/ContentCreateStructValidator.php - - message: "#^Cannot access property \\$value on Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\Values\\\\Content\\\\Field\\|null\\.$#" count: 2 @@ -21685,11 +21660,6 @@ parameters: count: 1 path: src/lib/Repository/Validator/ContentUpdateStructValidator.php - - - message: "#^Method Ibexa\\\\Core\\\\Repository\\\\Validator\\\\ContentUpdateStructValidator\\:\\:validate\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/lib/Repository/Validator/ContentUpdateStructValidator.php - - message: "#^Property Ibexa\\\\Core\\\\Repository\\\\Validator\\\\ContentUpdateStructValidator\\:\\:\\$contentLanguageHandler \\(Ibexa\\\\Core\\\\Persistence\\\\Legacy\\\\Content\\\\Language\\\\Handler\\) does not accept Ibexa\\\\Contracts\\\\Core\\\\Persistence\\\\Content\\\\Language\\\\Handler\\.$#" count: 1 @@ -21720,16 +21690,6 @@ parameters: count: 1 path: src/lib/Repository/Validator/UserPasswordValidator.php - - - message: "#^Method Ibexa\\\\Core\\\\Repository\\\\Validator\\\\VersionValidator\\:\\:validate\\(\\) has parameter \\$context with no value type specified in iterable type array\\.$#" - count: 1 - path: src/lib/Repository/Validator/VersionValidator.php - - - - message: "#^Method Ibexa\\\\Core\\\\Repository\\\\Validator\\\\VersionValidator\\:\\:validate\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/lib/Repository/Validator/VersionValidator.php - - message: "#^Call to method getValue\\(\\) on an unknown class eZ\\\\Publish\\\\API\\\\Repository\\\\Values\\\\Content\\\\Field\\.$#" count: 1 @@ -56730,11 +56690,6 @@ parameters: count: 1 path: tests/lib/Repository/ContentValidator/ContentValidatorStrategyTest.php - - - message: "#^Method class@anonymous/tests/lib/Repository/ContentValidator/ContentValidatorStrategyTest\\.php\\:87\\:\\:validate\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: tests/lib/Repository/ContentValidator/ContentValidatorStrategyTest.php - - message: "#^Property class@anonymous/tests/lib/Repository/ContentValidator/ContentValidatorStrategyTest\\.php\\:87\\:\\:\\$validationReturn type has no value type specified in iterable type array\\.$#" count: 1 diff --git a/src/contracts/Repository/Validator/ContentValidator.php b/src/contracts/Repository/Validator/ContentValidator.php index e8303da534..e71607afde 100644 --- a/src/contracts/Repository/Validator/ContentValidator.php +++ b/src/contracts/Repository/Validator/ContentValidator.php @@ -21,8 +21,16 @@ public function supports(ValueObject $object): bool; * @param string[]|null $fieldIdentifiers List of field identifiers for partial validation or null for * case of full validation. Empty identifiers array is equal to no validation. * - * @return array Grouped validation errors by field definition and language code, in format: - * $returnValue[string|int $fieldDefinitionId][string $languageCode] = $fieldErrors; + * @phpstan-return array< + * int, + * array< + * string, + * \Ibexa\Contracts\Core\FieldType\ValidationError|\Ibexa\Contracts\Core\FieldType\ValidationError[] + * > + * > + * + * @return array Grouped validation errors by field definition ID and language code, in format: + * $returnValue[int $fieldDefinitionId][string $languageCode] = $fieldErrors; * * @throws \Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException */ diff --git a/src/contracts/Repository/Values/ContentType/FieldDefinition.php b/src/contracts/Repository/Values/ContentType/FieldDefinition.php index 69d4aaa233..f27f93bb68 100644 --- a/src/contracts/Repository/Values/ContentType/FieldDefinition.php +++ b/src/contracts/Repository/Values/ContentType/FieldDefinition.php @@ -17,7 +17,7 @@ * * @property-read array $fieldSettings calls getFieldSettings() * @property-read array $validatorConfiguration calls getValidatorConfiguration() - * @property-read mixed $id the id of the field definition + * @property-read int $id the id of the field definition * @property-read string $identifier the identifier of the field definition * @property-read string $fieldGroup the field group name * @property-read int $position the position of the field definition in the content type @@ -35,7 +35,7 @@ abstract class FieldDefinition extends ValueObject implements MultiLanguageName, /** * the unique id of this field definition. * - * @var mixed + * @var int */ protected $id; diff --git a/src/contracts/Repository/Values/ContentType/FieldDefinitionCollection.php b/src/contracts/Repository/Values/ContentType/FieldDefinitionCollection.php index 30417f23e9..f43b4c749d 100644 --- a/src/contracts/Repository/Values/ContentType/FieldDefinitionCollection.php +++ b/src/contracts/Repository/Values/ContentType/FieldDefinitionCollection.php @@ -13,6 +13,9 @@ use Countable; use IteratorAggregate; +/** + * @phpstan-extends \IteratorAggregate<\Ibexa\Contracts\Core\Repository\Values\ContentType\FieldDefinition> + */ interface FieldDefinitionCollection extends Countable, IteratorAggregate, ArrayAccess { /** diff --git a/src/lib/Base/Exceptions/ContentFieldValidationException.php b/src/lib/Base/Exceptions/ContentFieldValidationException.php index a5c253ddb8..0b8091dca4 100644 --- a/src/lib/Base/Exceptions/ContentFieldValidationException.php +++ b/src/lib/Base/Exceptions/ContentFieldValidationException.php @@ -25,10 +25,10 @@ class ContentFieldValidationException extends APIContentFieldValidationException * Example: * * $fieldErrors = $exception->getFieldErrors(); - * $fieldErrors["43"]["eng-GB"]->getTranslatableMessage(); + * $fieldErrors[43]["eng-GB"]->getTranslatableMessage(); * * - * @var array> + * @var array> */ protected $errors; @@ -40,7 +40,7 @@ class ContentFieldValidationException extends APIContentFieldValidationException * * Also sets the given $fieldErrors to the internal property, retrievable by getFieldErrors() * - * @param array> $errors + * @param array> $errors */ public function __construct(array $errors) { @@ -52,7 +52,7 @@ public function __construct(array $errors) /** * Generates: Content fields did not validate exception with additional information on affected fields. * - * @param array> $errors + * @param array> $errors */ public static function createNewWithMultiline(array $errors, ?string $contentName = null): self { @@ -72,7 +72,7 @@ public static function createNewWithMultiline(array $errors, ?string $contentNam /** * Returns an array of field validation error messages. * - * @return array> + * @return array> */ public function getFieldErrors() { @@ -89,11 +89,17 @@ private function generateValidationErrorsMessages(): string $validationErrors[] = sprintf('Limit: %d of validation errors has been exceeded.', $maxMessagesNumber); } + /** @var callable(string|\Ibexa\Contracts\Core\Repository\Values\Translation): string $convertToString */ + $convertToString = static function ($error): string { + return (string)$error; + }; + $validationErrors = array_map($convertToString, $validationErrors); + return "\n- " . implode("\n- ", $validationErrors); } /** - * @return array<\Ibexa\Core\FieldType\ValidationError> + * @return array<\Ibexa\Contracts\Core\Repository\Values\Translation> */ private function collectValidationErrors(): array { diff --git a/src/lib/Repository/Validator/VersionValidator.php b/src/lib/Repository/Validator/VersionValidator.php index 22e908b32d..7057780bc1 100644 --- a/src/lib/Repository/Validator/VersionValidator.php +++ b/src/lib/Repository/Validator/VersionValidator.php @@ -35,6 +35,12 @@ public function supports(ValueObject $object): bool return $object instanceof VersionInfo; } + /** + * @phpstan-param array{ + * content?: \Ibexa\Contracts\Core\Repository\Values\Content\Content, + * translations?: string[], + * } $context + */ public function validate( ValueObject $object, array $context = [], @@ -73,7 +79,7 @@ public function validate( if ($fieldType->isEmptyValue($fieldValue)) { if ($fieldDefinition->isRequired) { - $allFieldErrors[$fieldDefinition->identifier][$languageCode] = new ValidationError( + $allFieldErrors[$fieldDefinition->id][$languageCode] = new ValidationError( "Value for required field definition '%identifier%' with language '%languageCode%' is empty", null, ['%identifier%' => $fieldDefinition->identifier, '%languageCode%' => $languageCode], @@ -86,7 +92,7 @@ public function validate( $fieldValue ); if (!empty($fieldErrors)) { - $allFieldErrors[$fieldDefinition->identifier][$languageCode] = $fieldErrors; + $allFieldErrors[$fieldDefinition->id][$languageCode] = $fieldErrors; } } }