diff --git a/.github/workflows/code_samples.yaml b/.github/workflows/code_samples.yaml index 63c601f4d9..5ab0edcf37 100644 --- a/.github/workflows/code_samples.yaml +++ b/.github/workflows/code_samples.yaml @@ -46,6 +46,9 @@ jobs: - name: Run PHPStan analysis run: composer phpstan + - name: Deptrac + run: composer deptrac + - name: Run rector run: vendor/bin/rector process --dry-run --ansi diff --git a/.gitignore b/.gitignore index 3868734b6a..d243a010bd 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ auth.json .yarn yarn.lock docs/css/*.map +.deptrac.cache diff --git a/README.md b/README.md index a813260691..274283f000 100644 --- a/README.md +++ b/README.md @@ -54,12 +54,32 @@ of the command. ## Testing the code samples +### PHPStan This repository uses PHPStan to test the code samples. To run the tests locally execute the commands below: ```bash composer update composer phpstan ``` +Regenerate the baseline by running: +```bash +composer phpstan -- --generate-baseline +``` + +### Deptrac + +This repository uses Deptrac to test the code samples. To run the tests locally execute the commands below: + +```bash +composer update +composer deptrac +``` + +Regenerate the baseline by running: +```bash +vendor/bin/deptrac --formatter=baseline +``` + ## Where to View https://doc.ibexa.co diff --git a/code_samples/api/commerce/src/Command/CartCommand.php b/code_samples/api/commerce/src/Command/CartCommand.php index d44e01be36..136c263ad6 100644 --- a/code_samples/api/commerce/src/Command/CartCommand.php +++ b/code_samples/api/commerce/src/Command/CartCommand.php @@ -12,11 +12,11 @@ use Ibexa\Contracts\Cart\Value\EntryAddStruct; use Ibexa\Contracts\Cart\Value\EntryUpdateStruct; use Ibexa\Contracts\Checkout\Reorder\ReorderService; +use Ibexa\Contracts\Core\Repository\PermissionResolver; use Ibexa\Contracts\Core\Repository\UserService; use Ibexa\Contracts\OrderManagement\OrderServiceInterface; use Ibexa\Contracts\ProductCatalog\CurrencyServiceInterface; use Ibexa\Contracts\ProductCatalog\ProductServiceInterface; -use Ibexa\Core\Repository\Permission\PermissionResolver; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; diff --git a/code_samples/api/migration/src/Command/MigrationCommand.php b/code_samples/api/migration/src/Command/MigrationCommand.php index df0bf887b5..7f4938bbea 100644 --- a/code_samples/api/migration/src/Command/MigrationCommand.php +++ b/code_samples/api/migration/src/Command/MigrationCommand.php @@ -2,7 +2,7 @@ namespace App\Command; -use Ibexa\Migration\MigrationService; +use Ibexa\Contracts\Migration\MigrationService; use Ibexa\Migration\Repository\Migration; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; diff --git a/code_samples/api/public_php_api/src/Command/SegmentCommand.php b/code_samples/api/public_php_api/src/Command/SegmentCommand.php index abf71dad71..3b3fdd5f0f 100644 --- a/code_samples/api/public_php_api/src/Command/SegmentCommand.php +++ b/code_samples/api/public_php_api/src/Command/SegmentCommand.php @@ -4,7 +4,7 @@ use Ibexa\Contracts\Core\Repository\PermissionResolver; use Ibexa\Contracts\Core\Repository\UserService; -use Ibexa\Segmentation\Service\SegmentationService; +use Ibexa\Contracts\Segmentation\SegmentationServiceInterface; use Ibexa\Segmentation\Value\SegmentCreateStruct; use Ibexa\Segmentation\Value\SegmentGroupCreateStruct; use Symfony\Component\Console\Attribute\AsCommand; @@ -18,7 +18,7 @@ class SegmentCommand extends Command { public function __construct( - private readonly SegmentationService $segmentationService, + private readonly SegmentationServiceInterface $segmentationService, private readonly UserService $userService, private readonly PermissionResolver $permissionResolver ) { diff --git a/code_samples/back_office/images/src/PlaceholderProvider.php b/code_samples/back_office/images/src/PlaceholderProvider.php deleted file mode 100644 index 0d2024d3e3..0000000000 --- a/code_samples/back_office/images/src/PlaceholderProvider.php +++ /dev/null @@ -1,18 +0,0 @@ - $value, + 'value' => $value, ]; } } diff --git a/code_samples/catalog/custom_attribute_type/src/Attribute/Percent/Storage/PercentStorageDefinition.php b/code_samples/catalog/custom_attribute_type/src/Attribute/Percent/Storage/PercentStorageDefinition.php index 415c784344..eab81dd4c5 100644 --- a/code_samples/catalog/custom_attribute_type/src/Attribute/Percent/Storage/PercentStorageDefinition.php +++ b/code_samples/catalog/custom_attribute_type/src/Attribute/Percent/Storage/PercentStorageDefinition.php @@ -10,19 +10,18 @@ use Doctrine\DBAL\Types\Types; use Ibexa\Contracts\ProductCatalog\Local\Attribute\StorageDefinitionInterface; -use Ibexa\ProductCatalog\Local\Persistence\Legacy\Attribute\Float\StorageSchema; final class PercentStorageDefinition implements StorageDefinitionInterface { public function getColumns(): array { return [ - StorageSchema::COLUMN_VALUE => Types::FLOAT, + 'value' => Types::FLOAT, ]; } public function getTableName(): string { - return StorageSchema::TABLE_NAME; + return 'app_product_specification_attribute_percent'; } } diff --git a/composer.json b/composer.json index b21f1dc068..2f68258b95 100644 --- a/composer.json +++ b/composer.json @@ -73,14 +73,22 @@ "ibexa/tree-builder": "~5.0.x-dev", "ibexa/discounts": "~5.0.x-dev", "ibexa/discounts-codes": "~5.0.x-dev", - "ibexa/core-search": "~5.0.x-dev", "ibexa/product-catalog-symbol-attribute": "~5.0.x-dev", - "ibexa/messenger": "~5.0.x-dev" + "ibexa/core-search": "~5.0.x-dev", + "ibexa/messenger": "~5.0.x-dev", + "deptrac/deptrac": "^3.0" }, "scripts": { "fix-cs": "php-cs-fixer fix --config=.php-cs-fixer.php -v --show-progress=dots", "check-cs": "@fix-cs --dry-run", - "phpstan": "phpstan analyse" + "phpstan": "phpstan analyse", + "deptrac": "deptrac analyse" + }, + "scripts-descriptions": { + "fix-cs": "Automatically fixes code style in all files", + "check-cs": "Run code style checker for all files", + "phpstan": "Run static code analysis", + "deptrac": "Run Deptrac architecture testing" }, "config": { "allow-plugins": false diff --git a/deptrac.baseline.yaml b/deptrac.baseline.yaml new file mode 100644 index 0000000000..f8b3d5c3b6 --- /dev/null +++ b/deptrac.baseline.yaml @@ -0,0 +1,184 @@ +deptrac: + skip_violations: + App\AutomatedTranslation\ImageFieldEncoder: + - Ibexa\Core\FieldType\Image\Value + App\Block\Listener\MyBlockListener: + - Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\BlockRenderEvents + - Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Event\PreRenderEvent + App\CatalogFilter\ProductNameFilterFormMapper: + - Ibexa\Bundle\ProductCatalog\Form\Type\TagifyType + App\Checkout\Workflow\Strategy\NewWorkflow: + - Ibexa\Checkout\Value\Workflow\Workflow + App\Checkout\Workflow\Strategy\NewWorkflowConditionalStep: + - Ibexa\Checkout\Value\Workflow\Workflow + App\Command\AddMissingAltTextCommand: + - Ibexa\Core\FieldType\Image\Value + - Ibexa\Core\IO\IOBinarydataHandler + App\Command\CalendarCommand: + - Ibexa\Scheduler\Calendar\EventAction\RescheduleEventActionContext + App\Command\CatalogCommand: + - Ibexa\ProductCatalog\Local\Repository\Values\Catalog\Status + App\Command\CreateImageCommand: + - Ibexa\Core\FieldType\Image\Value + App\Command\ManageDiscountsCommand: + - Ibexa\DiscountsCodes\Value\DiscountCondition\IsValidDiscountCode + - Ibexa\Discounts\Value\DiscountCondition\IsInCurrency + - Ibexa\Discounts\Value\DiscountCondition\IsInRegions + - Ibexa\Discounts\Value\DiscountCondition\IsProductInArray + - Ibexa\Discounts\Value\DiscountRule\FixedAmount + App\Command\MigrationCommand: + - Ibexa\Migration\Repository\Migration + App\Command\PaymentMethodCommand: + - Ibexa\Payment\Values\PaymentMethodType + App\Command\SegmentCommand: + - Ibexa\Segmentation\Value\SegmentCreateStruct + - Ibexa\Segmentation\Value\SegmentGroupCreateStruct + App\Command\ShippingMethodCommand: + - Ibexa\ProductCatalog\Local\Repository\Values\Region + - Ibexa\Shipping\Value\ShippingMethodType + App\Command\ViewCommand: + - Ibexa\Core\MVC\Symfony\View\Builder\ContentViewBuilder + - Ibexa\Core\MVC\Symfony\View\Renderer\TemplateRenderer + App\Controller\AllContentListController: + - Ibexa\AdminUi\Form\Factory\FormFactory + - Ibexa\Core\Pagination\Pagerfanta\LocationSearchAdapter + App\Controller\BreadcrumbController: + - Ibexa\Bundle\Core\Controller + App\Controller\Checkout\OnePageCheckout: + - Ibexa\Bundle\Checkout\Controller\AbstractStepController + App\Controller\Checkout\Step\SelectSeatStepController: + - Ibexa\Bundle\Checkout\Controller\AbstractStepController + App\Controller\CustomCheckoutController: + - Ibexa\Bundle\Core\Controller + App\Controller\CustomController: + - Ibexa\Core\MVC\Symfony\Security\Authorization\Attribute + App\Controller\CustomFilterController: + - Ibexa\Bundle\Core\Controller + - Ibexa\Core\MVC\Symfony\View\ContentView + App\Controller\PaginationController: + - Ibexa\Bundle\Core\Controller + - Ibexa\Core\Pagination\Pagerfanta\ContentSearchAdapter + App\Controller\RelationController: + - Ibexa\Core\MVC\Symfony\View\View + App\Controller\SvgController: + - Ibexa\Core\Helper\TranslationHelper + - Ibexa\Core\IO\IOServiceInterface + - Ibexa\Core\MVC\Symfony\Controller\Controller + App\Corporate\EventSubscriber\ApplicationDetailsViewSubscriber: + - Ibexa\Bundle\CorporateAccount\EventSubscriber\AbstractViewSubscriber + - Ibexa\Core\MVC\Symfony\SiteAccess\SiteAccessServiceInterface + - Ibexa\Core\MVC\Symfony\View\View + - Ibexa\CorporateAccount\View\ApplicationDetailsView + App\Corporate\EventSubscriber\VerifyStateEventSubscriber: + - Ibexa\CorporateAccount\Event\ApplicationWorkflowEvents + - Ibexa\CorporateAccount\Persistence\Legacy\ApplicationState\HandlerInterface + - Ibexa\CorporateAccount\Persistence\Values\ApplicationStateUpdateStruct + App\EventListener\TextAnchorMenuTabListener: + - Ibexa\AdminUi\Menu\ContentEditAnchorMenuBuilder + - Ibexa\AdminUi\Menu\Event\ConfigureMenuEvent + App\EventSubscriber\BreadcrumbsMenuSubscriber: + - Ibexa\Bundle\Storefront\Menu\Builder\BreadcrumbsMenuBuilder + App\EventSubscriber\FormFieldDefinitionSubscriber: + - Ibexa\FormBuilder\Definition\FieldAttributeDefinitionBuilder + - Ibexa\FormBuilder\Event\FieldDefinitionEvent + - Ibexa\FormBuilder\Event\FormEvents + App\EventSubscriber\MyMenuSubscriber: + - Ibexa\AdminUi\Menu\Event\ConfigureMenuEvent + - Ibexa\AdminUi\Menu\MainMenuBuilder + App\Event\RandomBlockListener: + - Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\BlockRenderEvents + - Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Event\PreRenderEvent + App\Event\Subscriber\BlockEmbedEventEventSubscriber: + - Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\BlockRenderEvents + - Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Event\PreRenderEvent + App\Event\Subscriber\RichTextBlockSubscriber: + - Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\BlockRenderEvents + - Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Event\PreRenderEvent + - Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Twig\TwigRenderRequest + - Ibexa\FieldTypeRichText\RichText\DOMDocumentFactory + App\FieldType\HelloWorld\Comparison\Comparable: + - Ibexa\VersionComparison\ComparisonValue\StringComparisonValue + App\FieldType\HelloWorld\Comparison\HelloWorldComparisonEngine: + - Ibexa\VersionComparison\Engine\Value\StringComparisonEngine + App\FieldType\HelloWorld\Comparison\HelloWorldComparisonResult: + - Ibexa\VersionComparison\Result\Value\StringComparisonResult + App\FieldType\HelloWorld\Comparison\Value: + - Ibexa\VersionComparison\ComparisonValue\StringComparisonValue + App\FormBuilder\FieldType\Field\Mapper\CheckboxWithRichtextDescriptionFieldMapper: + - Ibexa\FormBuilder\FieldType\Field\Mapper\GenericFieldMapper + App\FormBuilder\Field\Mapper\CountryFieldMapper: + - Ibexa\FormBuilder\FieldType\Field\Mapper\GenericFieldMapper + App\FormBuilder\FormSubmission\Converter\RichtextDescriptionFieldSubmissionConverter: + - Ibexa\FormBuilder\FormSubmission\Converter\BooleanFieldSubmissionConverter + App\FormBuilder\Form\Type\FieldAttribute\AttributeRichtextDescriptionType: + - Ibexa\FieldTypeRichText\Form\Type\RichTextType + App\Form\Type\OnePageCheckoutType: + - Ibexa\Bundle\Checkout\Form\Type\AddressType + - Ibexa\Bundle\Payment\Form\Type\PaymentMethodChoiceType + - Ibexa\Bundle\Shipping\Form\Type\ShippingMethodChoiceType + App\GraphQL\Schema\MyCustomFieldDefinitionMapper: + - Ibexa\GraphQL\Schema\Domain\Content\Mapper\FieldDefinition\DecoratingFieldDefinitionMapper + App\Kernel: + - Ibexa\Bundle\Core\DependencyInjection\IbexaCoreExtension + App\Migrations\Action\AssignSection: + - Ibexa\Migration\ValueObject\Step\Action + App\Migrations\Action\AssignSectionExecutor: + - Ibexa\Migration\StepExecutor\ActionExecutor\ExecutorInterface + - Ibexa\Migration\ValueObject\Step\Action + App\Migrations\Matcher\SectionIdentifierGenerator: + - Ibexa\Migration\Generator\CriterionGenerator\GeneratorInterface + App\Migrations\Matcher\SectionIdentifierNormalizer: + - Ibexa\Bundle\Migration\Serializer\Normalizer\Criterion\AbstractCriterionNormalizer + App\Migrations\Step\ReplaceNameStep: + - Ibexa\Migration\ValueObject\Step\StepInterface + App\Migrations\Step\ReplaceNameStepExecutor: + - Ibexa\Core\FieldType\TextLine\Value + - Ibexa\Migration\ValueObject\Step\StepInterface + App\Migrations\Step\ReplaceNameStepNormalizer: + - Ibexa\Migration\ValueObject\Step\StepInterface + App\Notification\ListRenderer: + - Ibexa\Core\Notification\Renderer\NotificationRenderer + - Ibexa\Core\Notification\Renderer\TypedNotificationRendererInterface + App\Notification\MyRenderer: + - Ibexa\Core\Notification\Renderer\NotificationRenderer + - Ibexa\Core\Notification\Renderer\TypedNotificationRendererInterface + App\OAuth\GoogleResourceOwnerMapper: + - Ibexa\OAuth2Client\ResourceOwner\ResourceOwnerToExistingOrNewUserMapper + App\QueryType\LatestContentQueryType: + - Ibexa\Core\QueryType\QueryType + App\QueryType\MenuQueryType: + - Ibexa\Core\QueryType\QueryType + App\QueryType\OptionsBasedLatestContentQueryType: + - Ibexa\Core\QueryType\OptionsResolverBasedQueryType + - Ibexa\Core\QueryType\QueryType + App\Search\Model\Suggestion\ProductSuggestion: + - Ibexa\ProductCatalog\Local\Repository\Values\Product + App\Security\Limitation\CustomLimitationType: + - Ibexa\Core\Base\Exceptions\InvalidArgumentException + - Ibexa\Core\Base\Exceptions\InvalidArgumentType + - Ibexa\Core\FieldType\ValidationError + App\Security\Limitation\Mapper\CustomLimitationFormMapper: + - Ibexa\AdminUi\Limitation\LimitationFormMapperInterface + - Ibexa\Core\Limitation\LimitationIdentifierToLabelConverter + App\Security\Limitation\Mapper\CustomLimitationValueMapper: + - Ibexa\AdminUi\Limitation\LimitationValueMapperInterface + App\Security\MyPolicyProvider: + - Ibexa\Bundle\Core\DependencyInjection\Security\PolicyProvider\YamlPolicyProvider + App\Setting\Group\MyGroup: + - Ibexa\User\UserSetting\Group\AbstractGroup + App\Setting\Unit: + - Ibexa\Core\Base\Exceptions\InvalidArgumentException + App\ShippingMethodType\Storage\StorageDefinition: + - Ibexa\Shipping\Persistence\Legacy\ShippingMethod\AbstractOptionsStorageSchema + App\ShippingMethodType\Storage\StorageSchema: + - Ibexa\Shipping\Persistence\Legacy\ShippingMethod\AbstractOptionsStorageSchema + App\Tab\Dashboard\Everyone\EveryoneArticleTab: + - Ibexa\AdminUi\Tab\Dashboard\PagerLocationToDataMapper + - Ibexa\Core\Pagination\Pagerfanta\LocationSearchAdapter + App\View\Matcher\Owner: + - Ibexa\Core\MVC\Symfony\Matcher\ContentBased\MatcherInterface + - Ibexa\Core\MVC\Symfony\View\ContentValueView + - Ibexa\Core\MVC\Symfony\View\LocationValueView + - Ibexa\Core\MVC\Symfony\View\View + AttributeTypeExtension: + - Ibexa\PageBuilder\Form\Type\Attribute\AttributeType diff --git a/deptrac.yaml b/deptrac.yaml new file mode 100644 index 0000000000..c46f25cfc7 --- /dev/null +++ b/deptrac.yaml @@ -0,0 +1,54 @@ +imports: + - deptrac.baseline.yaml + +deptrac: + paths: + - ./code_samples + layers: + - name: CodeSamples + collectors: + - type: directory + value: code_samples + - name: IbexaContracts + collectors: + - type: classLike + value: .*Ibexa\\Contracts\\.* + - name: IbexaSiteAccessConfiguration + collectors: + - type: classLike + value: .*Ibexa\\Bundle\\Core\\DependencyInjection\\Configuration\\SiteAccessAware\\.* + - name: IbexaInternal + collectors: + - type: tagValueRegex + tag: '@internal' + - name: IbexaRest + collectors: + - type: classLike + value: .*Ibexa\\.*\\Rest\\.* + - type: classLike + value: .*Ibexa\\Rest\\.* + - name: IbexaConstraints + collectors: + - type: classLike + value: .*Ibexa\\.*\\Constraints\\.* + - name: IbexaNotAllowed + collectors: + - type: bool + must: + - type: classLike + value: .*Ibexa\\.* + must_not: + - type: layer + value: IbexaContracts + - type: layer + value: IbexaSiteAccessConfiguration + - type: layer + value: IbexaRest + - type: layer + value: IbexaConstraints + ruleset: + CodeSamples: + - IbexaContracts + - IbexaSiteAccessConfiguration + - IbexaRest + - IbexaConstraints diff --git a/docs/content_management/images/images.md b/docs/content_management/images/images.md index 331b9b0a06..a387383fae 100644 --- a/docs/content_management/images/images.md +++ b/docs/content_management/images/images.md @@ -113,17 +113,13 @@ You can also pass two additional parameters: With a placeholder generator you can download or generate placeholder images for any missing image. It proves useful when you're working on an existing database and are unable to download uploaded images to your local development environment, due to, for example, a large size of files. -If the original image cannot be resolved, the `PlaceholderAliasGenerator::getVariation` method generates a placeholder by delegating it to the implementation of the `PlaceholderProvider` interface, and saves it under the original path. +If the original image cannot be resolved, the `PlaceholderAliasGenerator::getVariation` method generates a placeholder by delegating it to the implementation of the [PlaceholderProvider](https://github.com/ibexa/core/blob/main/src/bundle/Core/Imagine/PlaceholderProvider.php) interface, and saves it under the original path. In [[= product_name =]], there are two implementations of the `PlaceholderProvider` interface: - [GenericProvider](#genericprovider) - [RemoteProvider](#remoteprovider) -``` php -[[= include_file('code_samples/back_office/images/src/PlaceholderProvider.php') =]] -``` - ### GenericProvider The [`GenericProvider`](https://github.com/ibexa/core/blob/main/src/bundle/Core/Imagine/PlaceholderProvider.php) package generates placeholders with basic information about the original image (see [example 1](#configuration-examples)). diff --git a/docs/pim/create_custom_attribute_type.md b/docs/pim/create_custom_attribute_type.md index 6e2907a99b..71fd03254f 100644 --- a/docs/pim/create_custom_attribute_type.md +++ b/docs/pim/create_custom_attribute_type.md @@ -120,6 +120,29 @@ Register the validator as a service and tag it with `ibexa.product_catalog.attri To ensure that values of the new attributes are stored correctly, you need to provide a storage converter and storage definition services. +### Database schema design + +The values are going to be stored within a table named `app_product_specification_attribute_percent`, in a column named `value`. + +=== "MySQL" + + ``` sql + CREATE TABLE app_product_specification_attribute_percent ( + id INT NOT NULL, + value DOUBLE PRECISION DEFAULT NULL, + INDEX app_product_specification_attribute_percent_value_idx (value), + PRIMARY KEY (id) + ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_520_ci` ENGINE = InnoDB; + ``` + +=== "PostgreSQL" + + ``` sql + CREATE TABLE app_product_specification_attribute_percent (id INT NOT NULL, value DOUBLE PRECISION DEFAULT NULL, PRIMARY KEY(id)); + CREATE INDEX app_product_specification_attribute_percent_value_idx ON app_product_specification_attribute_percent (value); + ALTER TABLE app_product_specification_attribute_percent ADD CONSTRAINT app_product_specification_attribute_percent_fk FOREIGN KEY (id) REFERENCES ibexa_product_specification_attribute (id) ON UPDATE CASCADE ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE; + ``` + ### Storage converter Start by creating a `PercentStorageConverter` class, which implements `Ibexa\Contracts\ProductCatalog\Local\Attribute\StorageConverterInterface`. diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index d5067dcdcc..17c4645013 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -25,7 +25,7 @@ parameters: path: code_samples/api/graphql/src/DependencyInjection/Compiler/MyCustomTypeGraphQLCompilerPass.php - - message: '#^Parameter \#1 \$migration of method Ibexa\\Migration\\MigrationService\:\:executeOne\(\) expects Ibexa\\Migration\\Repository\\Migration, Ibexa\\Migration\\Repository\\Migration\|null given\.$#' + message: '#^Parameter \#1 \$migration of method Ibexa\\Contracts\\Migration\\MigrationService\:\:executeOne\(\) expects Ibexa\\Migration\\Repository\\Migration, Ibexa\\Migration\\Repository\\Migration\|null given\.$#' identifier: argument.type count: 1 path: code_samples/api/migration/src/Command/MigrationCommand.php @@ -234,12 +234,6 @@ parameters: count: 1 path: code_samples/back_office/content_type/src/EventListener/TextAnchorMenuTabListener.php - - - message: '#^Method Ibexa\\Bundle\\Core\\Imagine\\PlaceholderProvider\:\:getPlaceholder\(\) has parameter \$options with no value type specified in iterable type array\.$#' - identifier: missingType.iterableValue - count: 1 - path: code_samples/back_office/images/src/PlaceholderProvider.php - - message: '#^Method App\\Security\\MyPolicyProvider\:\:getFiles\(\) return type has no value type specified in iterable type array\.$#' identifier: missingType.iterableValue