diff --git a/phpstan.neon.dist b/phpstan.neon.dist index f4fa0f42a0..cf22b6892b 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -6,7 +6,7 @@ includes: - vendor/phpstan/phpstan-symfony/rules.neon parameters: - level: 2 + level: 3 reportUnmatchedIgnoredErrors: false diff --git a/src/Sylius/Bundle/AdminBundle/Controller/DashboardController.php b/src/Sylius/Bundle/AdminBundle/Controller/DashboardController.php index 2ea795edf9..c1d283b5df 100644 --- a/src/Sylius/Bundle/AdminBundle/Controller/DashboardController.php +++ b/src/Sylius/Bundle/AdminBundle/Controller/DashboardController.php @@ -23,6 +23,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\RouterInterface; use Twig\Environment; +use Webmozart\Assert\Assert; final class DashboardController { @@ -71,9 +72,15 @@ final class DashboardController private function findChannelByCodeOrFindFirst(?string $channelCode): ?ChannelInterface { if (null !== $channelCode) { - return $this->channelRepository->findOneByCode($channelCode); + $channel = $this->channelRepository->findOneByCode($channelCode); + Assert::nullOrIsInstanceOf($channel, ChannelInterface::class); + + return $channel; } - return $this->channelRepository->findOneBy([]); + $channel = $this->channelRepository->findOneBy([]); + Assert::nullOrIsInstanceOf($channel, ChannelInterface::class); + + return $channel; } } diff --git a/src/Sylius/Bundle/ApiBundle/DataTransformer/LoggedInCustomerEmailAwareCommandDataTransformer.php b/src/Sylius/Bundle/ApiBundle/DataTransformer/LoggedInCustomerEmailAwareCommandDataTransformer.php index b81f3bacb6..ef498265e1 100644 --- a/src/Sylius/Bundle/ApiBundle/DataTransformer/LoggedInCustomerEmailAwareCommandDataTransformer.php +++ b/src/Sylius/Bundle/ApiBundle/DataTransformer/LoggedInCustomerEmailAwareCommandDataTransformer.php @@ -52,7 +52,10 @@ final class LoggedInCustomerEmailAwareCommandDataTransformer implements CommandD /** @var UserInterface|null $user */ $user = $this->userContext->getUser(); if ($user instanceof ShopUserInterface) { - return $user->getCustomer(); + $customer = $user->getCustomer(); + Assert::nullOrIsInstanceOf($customer, CustomerInterface::class); + + return $customer; } return null; diff --git a/src/Sylius/Bundle/ApiBundle/DataTransformer/LoggedInCustomerEmailIfNotSetAwareCommandDataTransformer.php b/src/Sylius/Bundle/ApiBundle/DataTransformer/LoggedInCustomerEmailIfNotSetAwareCommandDataTransformer.php index 6a0ada1418..3797d921e4 100644 --- a/src/Sylius/Bundle/ApiBundle/DataTransformer/LoggedInCustomerEmailIfNotSetAwareCommandDataTransformer.php +++ b/src/Sylius/Bundle/ApiBundle/DataTransformer/LoggedInCustomerEmailIfNotSetAwareCommandDataTransformer.php @@ -57,7 +57,10 @@ final class LoggedInCustomerEmailIfNotSetAwareCommandDataTransformer implements /** @var UserInterface|null $user */ $user = $this->userContext->getUser(); if ($user instanceof ShopUserInterface) { - return $user->getCustomer(); + $customer = $user->getCustomer(); + Assert::nullOrIsInstanceOf($customer, CustomerInterface::class); + + return $customer; } return null; diff --git a/src/Sylius/Bundle/ApiBundle/Serializer/ShippingMethodNormalizer.php b/src/Sylius/Bundle/ApiBundle/Serializer/ShippingMethodNormalizer.php index 7856c69302..6761d5ae6d 100644 --- a/src/Sylius/Bundle/ApiBundle/Serializer/ShippingMethodNormalizer.php +++ b/src/Sylius/Bundle/ApiBundle/Serializer/ShippingMethodNormalizer.php @@ -68,7 +68,7 @@ final class ShippingMethodNormalizer implements ContextAwareNormalizerInterface, } if (!isset($filters['tokenValue']) || !isset($filters['shipmentId'])) { - return; + return null; } /** @var ChannelInterface $channel */ diff --git a/src/Sylius/Bundle/CoreBundle/Form/Extension/CountryTypeExtension.php b/src/Sylius/Bundle/CoreBundle/Form/Extension/CountryTypeExtension.php index 4721ba9c80..c4af70f963 100644 --- a/src/Sylius/Bundle/CoreBundle/Form/Extension/CountryTypeExtension.php +++ b/src/Sylius/Bundle/CoreBundle/Form/Extension/CountryTypeExtension.php @@ -80,9 +80,7 @@ final class CountryTypeExtension extends AbstractTypeExtension return Countries::getName($code); } - /** - * @return array|CountryInterface[] - */ + /** @return string[] */ private function getAvailableCountries(): array { $availableCountries = Countries::getNames(); diff --git a/src/Sylius/Bundle/CoreBundle/Form/Extension/LocaleTypeExtension.php b/src/Sylius/Bundle/CoreBundle/Form/Extension/LocaleTypeExtension.php index e13a7550f6..939b810689 100644 --- a/src/Sylius/Bundle/CoreBundle/Form/Extension/LocaleTypeExtension.php +++ b/src/Sylius/Bundle/CoreBundle/Form/Extension/LocaleTypeExtension.php @@ -66,9 +66,7 @@ final class LocaleTypeExtension extends AbstractTypeExtension return Locales::getName($code); } - /** - * @return array|LocaleInterface[] - */ + /** @return string[] */ private function getAvailableLocales(): array { $availableLocales = Locales::getNames(); diff --git a/src/Sylius/Bundle/CoreBundle/Installer/Provider/DatabaseSetupCommandsProvider.php b/src/Sylius/Bundle/CoreBundle/Installer/Provider/DatabaseSetupCommandsProvider.php index 8b02b1d862..9ed13841a6 100644 --- a/src/Sylius/Bundle/CoreBundle/Installer/Provider/DatabaseSetupCommandsProvider.php +++ b/src/Sylius/Bundle/CoreBundle/Installer/Provider/DatabaseSetupCommandsProvider.php @@ -21,6 +21,7 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ConfirmationQuestion; use Symfony\Component\Console\Style\SymfonyStyle; +use Webmozart\Assert\Assert; final class DatabaseSetupCommandsProvider implements DatabaseSetupCommandsProviderInterface { @@ -131,6 +132,9 @@ final class DatabaseSetupCommandsProvider implements DatabaseSetupCommandsProvid private function getEntityManager(): EntityManagerInterface { - return $this->doctrineRegistry->getManager(); + $objectManager = $this->doctrineRegistry->getManager(); + Assert::isInstanceOf($objectManager, EntityManagerInterface::class); + + return $objectManager; } } diff --git a/src/Sylius/Bundle/CoreBundle/OAuth/UserProvider.php b/src/Sylius/Bundle/CoreBundle/OAuth/UserProvider.php index 9fb2ffd5c9..9b5b68bf48 100644 --- a/src/Sylius/Bundle/CoreBundle/OAuth/UserProvider.php +++ b/src/Sylius/Bundle/CoreBundle/OAuth/UserProvider.php @@ -57,7 +57,10 @@ class UserProvider extends BaseUserProvider implements AccountConnectorInterface ]); if ($oauth instanceof UserOAuthInterface) { - return $oauth->getUser(); + $user = $oauth->getUser(); + Assert::isInstanceOf($user, UserInterface::class); + + return $user; } if (null !== $response->getEmail()) { @@ -79,6 +82,8 @@ class UserProvider extends BaseUserProvider implements AccountConnectorInterface } /** + * @return SyliusUserInterface&UserInterface + * * Ad-hoc creation of user. */ private function createUserByOAuthUserResponse(UserResponseInterface $response): SyliusUserInterface @@ -128,11 +133,14 @@ class UserProvider extends BaseUserProvider implements AccountConnectorInterface } /** + * @return SyliusUserInterface&UserInterface + * * Attach OAuth sign-in provider account to existing user. */ private function updateUserByOAuthUserResponse(UserInterface $user, UserResponseInterface $response): SyliusUserInterface { /** @var SyliusUserInterface $user */ + Assert::isInstanceOf($user, UserInterface::class); Assert::isInstanceOf($user, SyliusUserInterface::class); /** @var UserOAuthInterface $oauth */ diff --git a/src/Sylius/Bundle/CoreBundle/Provider/FlashBagProvider.php b/src/Sylius/Bundle/CoreBundle/Provider/FlashBagProvider.php index cde2e65346..e451872681 100644 --- a/src/Sylius/Bundle/CoreBundle/Provider/FlashBagProvider.php +++ b/src/Sylius/Bundle/CoreBundle/Provider/FlashBagProvider.php @@ -16,6 +16,7 @@ namespace Sylius\Bundle\CoreBundle\Provider; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; use Symfony\Component\HttpFoundation\Session\SessionInterface; +use Webmozart\Assert\Assert; final class FlashBagProvider { @@ -27,9 +28,15 @@ final class FlashBagProvider } if ($requestStackSessionOrFlashBag instanceof SessionInterface) { - return $requestStackSessionOrFlashBag->getBag('flashes'); + $flashBag = $requestStackSessionOrFlashBag->getBag('flashes'); + Assert::isInstanceOf($flashBag, FlashBagInterface::class); + + return $flashBag; } - return $requestStackSessionOrFlashBag->getSession()->getBag('flashes'); + $flashBag = $requestStackSessionOrFlashBag->getSession()->getBag('flashes'); + Assert::isInstanceOf($flashBag, FlashBagInterface::class); + + return $flashBag; } } diff --git a/src/Sylius/Bundle/PayumBundle/Request/GetStatus.php b/src/Sylius/Bundle/PayumBundle/Request/GetStatus.php index 7e2343388a..219979199c 100644 --- a/src/Sylius/Bundle/PayumBundle/Request/GetStatus.php +++ b/src/Sylius/Bundle/PayumBundle/Request/GetStatus.php @@ -20,6 +20,7 @@ class GetStatus extends BaseGetStatus { /** * @psalm-suppress NonInvariantDocblockPropertyType + * @phpstan-ignore-next-line * * @var string */ diff --git a/src/Sylius/Bundle/ProductBundle/Form/EventSubscriber/GenerateProductVariantsSubscriber.php b/src/Sylius/Bundle/ProductBundle/Form/EventSubscriber/GenerateProductVariantsSubscriber.php index d625216ca8..9cd3faa3d9 100644 --- a/src/Sylius/Bundle/ProductBundle/Form/EventSubscriber/GenerateProductVariantsSubscriber.php +++ b/src/Sylius/Bundle/ProductBundle/Form/EventSubscriber/GenerateProductVariantsSubscriber.php @@ -59,9 +59,15 @@ final class GenerateProductVariantsSubscriber implements EventSubscriberInterfac private function getFlashBag(): FlashBagInterface { if ($this->requestStackOrSession instanceof RequestStack) { - return $this->requestStackOrSession->getSession()->getBag('flashes'); + $flashBag = $this->requestStackOrSession->getSession()->getBag('flashes'); + Assert::isInstanceOf($flashBag, FlashBagInterface::class); + + return $flashBag; } - return $this->requestStackOrSession->getBag('flashes'); + $flashBag = $this->requestStackOrSession->getBag('flashes'); + Assert::isInstanceOf($flashBag, FlashBagInterface::class); + + return $flashBag; } } diff --git a/src/Sylius/Bundle/ShopBundle/Router/LocaleStrippingRouter.php b/src/Sylius/Bundle/ShopBundle/Router/LocaleStrippingRouter.php index 61b0071339..1289bb85d0 100644 --- a/src/Sylius/Bundle/ShopBundle/Router/LocaleStrippingRouter.php +++ b/src/Sylius/Bundle/ShopBundle/Router/LocaleStrippingRouter.php @@ -57,11 +57,14 @@ final class LocaleStrippingRouter implements RouterInterface, WarmableInterface return $this->router->getRouteCollection(); } - public function warmUp($cacheDir): void + /** @return string[] */ + public function warmUp($cacheDir): array { if ($this->router instanceof WarmableInterface) { - $this->router->warmUp($cacheDir); + return $this->router->warmUp($cacheDir); } + + return []; } private function removeUnusedQueryArgument(string $url, string $key, string $value): string diff --git a/src/Sylius/Bundle/UserBundle/Command/AbstractRoleCommand.php b/src/Sylius/Bundle/UserBundle/Command/AbstractRoleCommand.php index a550f1de9f..adf94c9320 100644 --- a/src/Sylius/Bundle/UserBundle/Command/AbstractRoleCommand.php +++ b/src/Sylius/Bundle/UserBundle/Command/AbstractRoleCommand.php @@ -123,7 +123,10 @@ abstract class AbstractRoleCommand extends ContainerAwareCommand { $class = $this->getUserModelClass($userType); - return $this->getEntityManager($userType)->getRepository($class); + $userRepository = $this->getEntityManager($userType)->getRepository($class); + Assert::isInstanceOf($userRepository, UserRepositoryInterface::class); + + return $userRepository; } protected function getAvailableUserTypes(): array diff --git a/src/Sylius/Bundle/UserBundle/Provider/EmailProvider.php b/src/Sylius/Bundle/UserBundle/Provider/EmailProvider.php index 5d0db0180b..4ec378d65d 100644 --- a/src/Sylius/Bundle/UserBundle/Provider/EmailProvider.php +++ b/src/Sylius/Bundle/UserBundle/Provider/EmailProvider.php @@ -14,11 +14,15 @@ declare(strict_types=1); namespace Sylius\Bundle\UserBundle\Provider; use Symfony\Component\Security\Core\User\UserInterface; +use Webmozart\Assert\Assert; class EmailProvider extends AbstractUserProvider { protected function findUser(string $uniqueIdentifier): ?UserInterface { - return $this->userRepository->findOneByEmail($uniqueIdentifier); + $user = $this->userRepository->findOneByEmail($uniqueIdentifier); + Assert::nullOrIsInstanceOf($user, UserInterface::class); + + return $user; } } diff --git a/src/Sylius/Bundle/UserBundle/Provider/UsernameOrEmailProvider.php b/src/Sylius/Bundle/UserBundle/Provider/UsernameOrEmailProvider.php index ebdc34c4be..11d405db2e 100644 --- a/src/Sylius/Bundle/UserBundle/Provider/UsernameOrEmailProvider.php +++ b/src/Sylius/Bundle/UserBundle/Provider/UsernameOrEmailProvider.php @@ -14,15 +14,22 @@ declare(strict_types=1); namespace Sylius\Bundle\UserBundle\Provider; use Symfony\Component\Security\Core\User\UserInterface; +use Webmozart\Assert\Assert; class UsernameOrEmailProvider extends AbstractUserProvider { protected function findUser(string $uniqueIdentifier): ?UserInterface { if (filter_var($uniqueIdentifier, \FILTER_VALIDATE_EMAIL)) { - return $this->userRepository->findOneByEmail($uniqueIdentifier); + $user = $this->userRepository->findOneByEmail($uniqueIdentifier); + Assert::nullOrIsInstanceOf($user, UserInterface::class); + + return $user; } - return $this->userRepository->findOneBy(['usernameCanonical' => $uniqueIdentifier]); + $user = $this->userRepository->findOneBy(['usernameCanonical' => $uniqueIdentifier]); + Assert::nullOrIsInstanceOf($user, UserInterface::class); + + return $user; } } diff --git a/src/Sylius/Bundle/UserBundle/Provider/UsernameProvider.php b/src/Sylius/Bundle/UserBundle/Provider/UsernameProvider.php index 5c941ae0c2..40be3b1249 100644 --- a/src/Sylius/Bundle/UserBundle/Provider/UsernameProvider.php +++ b/src/Sylius/Bundle/UserBundle/Provider/UsernameProvider.php @@ -14,11 +14,15 @@ declare(strict_types=1); namespace Sylius\Bundle\UserBundle\Provider; use Symfony\Component\Security\Core\User\UserInterface; +use Webmozart\Assert\Assert; class UsernameProvider extends AbstractUserProvider { protected function findUser(string $uniqueIdentifier): ?UserInterface { - return $this->userRepository->findOneBy(['usernameCanonical' => $uniqueIdentifier]); + $user = $this->userRepository->findOneBy(['usernameCanonical' => $uniqueIdentifier]); + Assert::nullOrIsInstanceOf($user, UserInterface::class); + + return $user; } } diff --git a/src/Sylius/Component/Channel/Context/SingleChannelContext.php b/src/Sylius/Component/Channel/Context/SingleChannelContext.php index 1b02fc9b1f..3fe3210678 100644 --- a/src/Sylius/Component/Channel/Context/SingleChannelContext.php +++ b/src/Sylius/Component/Channel/Context/SingleChannelContext.php @@ -15,6 +15,7 @@ namespace Sylius\Component\Channel\Context; use Sylius\Component\Channel\Model\ChannelInterface; use Sylius\Component\Channel\Repository\ChannelRepositoryInterface; +use Webmozart\Assert\Assert; final class SingleChannelContext implements ChannelContextInterface { @@ -29,7 +30,9 @@ final class SingleChannelContext implements ChannelContextInterface if (1 !== count($channels)) { throw new ChannelNotFoundException(); } + $channel = reset($channels); + Assert::isInstanceOf($channel, ChannelInterface::class); - return current($channels); + return $channel; } } diff --git a/src/Sylius/Component/Core/Factory/ChannelFactory.php b/src/Sylius/Component/Core/Factory/ChannelFactory.php index 44d04b2e82..17e8fa4fad 100644 --- a/src/Sylius/Component/Core/Factory/ChannelFactory.php +++ b/src/Sylius/Component/Core/Factory/ChannelFactory.php @@ -17,6 +17,7 @@ use Sylius\Component\Channel\Factory\ChannelFactoryInterface; use Sylius\Component\Channel\Model\ChannelInterface; use Sylius\Component\Core\Model\ChannelInterface as CoreChannelInterface; use Sylius\Component\Resource\Factory\FactoryInterface; +use Webmozart\Assert\Assert; final class ChannelFactory implements ChannelFactoryInterface { @@ -36,13 +37,11 @@ final class ChannelFactory implements ChannelFactoryInterface return $channel; } - /** - * @return CoreChannelInterface - */ public function createNamed(string $name): ChannelInterface { $channel = $this->createNew(); $channel->setName($name); + Assert::isInstanceOf($channel, ChannelInterface::class); return $channel; } diff --git a/src/Sylius/Component/Core/Model/Address.php b/src/Sylius/Component/Core/Model/Address.php index 595b00adb2..eeab5605b1 100644 --- a/src/Sylius/Component/Core/Model/Address.php +++ b/src/Sylius/Component/Core/Model/Address.php @@ -15,6 +15,7 @@ namespace Sylius\Component\Core\Model; use Sylius\Component\Addressing\Model\Address as BaseAddress; use Sylius\Component\Customer\Model\CustomerInterface as BaseCustomerInterface; +use Webmozart\Assert\Assert; class Address extends BaseAddress implements AddressInterface { @@ -28,6 +29,7 @@ class Address extends BaseAddress implements AddressInterface public function setCustomer(?BaseCustomerInterface $customer): void { + Assert::nullOrIsInstanceOf($customer, CustomerInterface::class); $this->customer = $customer; } } diff --git a/src/Sylius/Component/Core/Model/CatalogPromotion.php b/src/Sylius/Component/Core/Model/CatalogPromotion.php index 3d0ecefc38..5c0ce741b0 100644 --- a/src/Sylius/Component/Core/Model/CatalogPromotion.php +++ b/src/Sylius/Component/Core/Model/CatalogPromotion.php @@ -18,6 +18,7 @@ use Doctrine\Common\Collections\Collection; use Sylius\Component\Channel\Model\ChannelInterface as BaseChannelInterface; use Sylius\Component\Promotion\Model\CatalogPromotion as BaseCatalogPromotion; use Sylius\Component\Promotion\Model\CatalogPromotionTranslation; +use Webmozart\Assert\Assert; class CatalogPromotion extends BaseCatalogPromotion implements CatalogPromotionInterface { @@ -41,6 +42,7 @@ class CatalogPromotion extends BaseCatalogPromotion implements CatalogPromotionI */ public function getChannels(): Collection { + /** @phpstan-ignore-next-line */ return $this->channels; } diff --git a/src/Sylius/Component/Core/Model/Order.php b/src/Sylius/Component/Core/Model/Order.php index 7b5a64f820..c5a40b4997 100644 --- a/src/Sylius/Component/Core/Model/Order.php +++ b/src/Sylius/Component/Core/Model/Order.php @@ -128,6 +128,7 @@ class Order extends BaseOrder implements OrderInterface public function setChannel(?BaseChannelInterface $channel): void { + Assert::isInstanceOf($channel, ChannelInterface::class); $this->channel = $channel; } @@ -208,6 +209,7 @@ class Order extends BaseOrder implements OrderInterface */ public function getPayments(): Collection { + /** @phpstan-ignore-next-line */ return $this->payments; } diff --git a/src/Sylius/Component/Core/Model/OrderInterface.php b/src/Sylius/Component/Core/Model/OrderInterface.php index b54aa9a034..a468acf32e 100644 --- a/src/Sylius/Component/Core/Model/OrderInterface.php +++ b/src/Sylius/Component/Core/Model/OrderInterface.php @@ -132,6 +132,8 @@ interface OrderInterface extends * @psalm-return Collection * * @psalm-suppress ImplementedReturnTypeMismatch + * + * @phpstan-ignore-next-line */ public function getItems(): Collection; diff --git a/src/Sylius/Component/Core/Model/OrderItem.php b/src/Sylius/Component/Core/Model/OrderItem.php index 9817c5a96d..63cd023813 100644 --- a/src/Sylius/Component/Core/Model/OrderItem.php +++ b/src/Sylius/Component/Core/Model/OrderItem.php @@ -54,7 +54,10 @@ class OrderItem extends BaseOrderItem implements OrderItemInterface public function getProduct(): ?ProductInterface { - return $this->variant->getProduct(); + $product = $this->variant->getProduct(); + Assert::nullOrIsInstanceOf($product, ProductInterface::class); + + return $product; } public function getProductName(): ?string diff --git a/src/Sylius/Component/Core/Model/OrderItemUnit.php b/src/Sylius/Component/Core/Model/OrderItemUnit.php index 8a650ab20d..9bcc60130e 100644 --- a/src/Sylius/Component/Core/Model/OrderItemUnit.php +++ b/src/Sylius/Component/Core/Model/OrderItemUnit.php @@ -41,6 +41,7 @@ class OrderItemUnit extends BaseOrderItemUnit implements OrderItemUnitInterface public function setShipment(?BaseShipmentInterface $shipment): void { + Assert::nullOrIsInstanceOf($shipment, ShipmentInterface::class); $this->shipment = $shipment; } diff --git a/src/Sylius/Component/Core/Model/Payment.php b/src/Sylius/Component/Core/Model/Payment.php index 36ddd54453..96189ccdc8 100644 --- a/src/Sylius/Component/Core/Model/Payment.php +++ b/src/Sylius/Component/Core/Model/Payment.php @@ -15,6 +15,7 @@ namespace Sylius\Component\Core\Model; use Sylius\Component\Order\Model\OrderInterface as BaseOrderInterface; use Sylius\Component\Payment\Model\Payment as BasePayment; +use Webmozart\Assert\Assert; class Payment extends BasePayment implements PaymentInterface { @@ -23,6 +24,8 @@ class Payment extends BasePayment implements PaymentInterface public function getOrder(): ?BaseOrderInterface { + Assert::isInstanceOf($this->order, OrderInterface::class); + return $this->order; } diff --git a/src/Sylius/Component/Core/Model/Product.php b/src/Sylius/Component/Core/Model/Product.php index ac18fb03ec..aa21b19347 100644 --- a/src/Sylius/Component/Core/Model/Product.php +++ b/src/Sylius/Component/Core/Model/Product.php @@ -149,6 +149,7 @@ class Product extends BaseProduct implements ProductInterface, ReviewableProduct */ public function getChannels(): Collection { + /** @phpstan-ignore-next-line */ return $this->channels; } @@ -272,7 +273,10 @@ class Product extends BaseProduct implements ProductInterface, ReviewableProduct */ public function getTranslation(?string $locale = null): TranslationInterface { - return parent::getTranslation($locale); + $productTranslation = parent::getTranslation($locale); + Assert::isInstanceOf($productTranslation, ProductTranslationInterface::class); + + return $productTranslation; } /** diff --git a/src/Sylius/Component/Core/Model/ProductVariant.php b/src/Sylius/Component/Core/Model/ProductVariant.php index 6921b3f0c7..3a6958ef4d 100644 --- a/src/Sylius/Component/Core/Model/ProductVariant.php +++ b/src/Sylius/Component/Core/Model/ProductVariant.php @@ -19,6 +19,7 @@ use Doctrine\Common\Comparable; use Sylius\Component\Product\Model\ProductVariant as BaseVariant; use Sylius\Component\Shipping\Model\ShippingCategoryInterface; use Sylius\Component\Taxation\Model\TaxCategoryInterface; +use Webmozart\Assert\Assert; class ProductVariant extends BaseVariant implements ProductVariantInterface, Comparable, \Stringable { @@ -291,6 +292,7 @@ class ProductVariant extends BaseVariant implements ProductVariantInterface, Com */ public function getImages(): Collection { + /** @phpstan-ignore-next-line */ return $this->images; } @@ -300,9 +302,13 @@ class ProductVariant extends BaseVariant implements ProductVariantInterface, Com */ public function getImagesByType(string $type): Collection { - return $this->images->filter(function (ProductImageInterface $image) use ($type): bool { + /** @var Collection $imagesByType */ + $imagesByType = $this->images->filter(function (ProductImageInterface $image) use ($type): bool { return $type === $image->getType(); }); + Assert::allIsInstanceOf($imagesByType, ImageInterface::class); + + return $imagesByType; } public function hasImages(): bool diff --git a/src/Sylius/Component/Core/Model/Promotion.php b/src/Sylius/Component/Core/Model/Promotion.php index 689a3c9cf8..fa5071be7b 100644 --- a/src/Sylius/Component/Core/Model/Promotion.php +++ b/src/Sylius/Component/Core/Model/Promotion.php @@ -41,6 +41,7 @@ class Promotion extends BasePromotion implements PromotionInterface */ public function getChannels(): Collection { + /** @phpstan-ignore-next-line */ return $this->channels; } diff --git a/src/Sylius/Component/Core/Model/Shipment.php b/src/Sylius/Component/Core/Model/Shipment.php index 7d9af9acc6..cdef126b58 100644 --- a/src/Sylius/Component/Core/Model/Shipment.php +++ b/src/Sylius/Component/Core/Model/Shipment.php @@ -18,6 +18,7 @@ use Doctrine\Common\Collections\Collection; use Sylius\Component\Order\Model\AdjustmentInterface as BaseAdjustmentInterface; use Sylius\Component\Order\Model\OrderInterface as BaseOrderInterface; use Sylius\Component\Shipping\Model\Shipment as BaseShipment; +use Webmozart\Assert\Assert; class Shipment extends BaseShipment implements ShipmentInterface { @@ -44,6 +45,7 @@ class Shipment extends BaseShipment implements ShipmentInterface public function getOrder(): ?BaseOrderInterface { + Assert::nullOrIsInstanceOf($this->order, OrderInterface::class); return $this->order; } diff --git a/src/Sylius/Component/Core/Model/ShippingMethod.php b/src/Sylius/Component/Core/Model/ShippingMethod.php index 4d6e10ca9c..2d7770d85a 100644 --- a/src/Sylius/Component/Core/Model/ShippingMethod.php +++ b/src/Sylius/Component/Core/Model/ShippingMethod.php @@ -70,6 +70,7 @@ class ShippingMethod extends BaseShippingMethod implements ShippingMethodInterfa */ public function getChannels(): Collection { + /** @phpstan-ignore-next-line */ return $this->channels; } diff --git a/src/Sylius/Component/Core/Payment/Provider/OrderPaymentProvider.php b/src/Sylius/Component/Core/Payment/Provider/OrderPaymentProvider.php index 5d15c41b24..abaf2d7a69 100644 --- a/src/Sylius/Component/Core/Payment/Provider/OrderPaymentProvider.php +++ b/src/Sylius/Component/Core/Payment/Provider/OrderPaymentProvider.php @@ -23,6 +23,7 @@ use Sylius\Component\Payment\Factory\PaymentFactoryInterface; use Sylius\Component\Payment\PaymentTransitions; use Sylius\Component\Payment\Resolver\DefaultPaymentMethodResolverInterface; use Sylius\Component\Resource\StateMachine\StateMachineInterface; +use Webmozart\Assert\Assert; final class OrderPaymentProvider implements OrderPaymentProviderInterface { @@ -72,8 +73,10 @@ final class OrderPaymentProvider implements OrderPaymentProviderInterface { try { $payment->setOrder($order); + $paymentMethod = $this->defaultPaymentMethodResolver->getDefaultPaymentMethod($payment); + Assert::isInstanceOf($paymentMethod, PaymentMethodInterface::class); - return $this->defaultPaymentMethodResolver->getDefaultPaymentMethod($payment); + return $paymentMethod; } catch (UnresolvedDefaultPaymentMethodException) { return null; } diff --git a/src/Sylius/Component/Core/StateResolver/OrderPaymentStateResolver.php b/src/Sylius/Component/Core/StateResolver/OrderPaymentStateResolver.php index 480f187bbc..17cdf9c86b 100644 --- a/src/Sylius/Component/Core/StateResolver/OrderPaymentStateResolver.php +++ b/src/Sylius/Component/Core/StateResolver/OrderPaymentStateResolver.php @@ -122,8 +122,12 @@ final class OrderPaymentStateResolver implements StateResolverInterface */ private function getPaymentsWithState(OrderInterface $order, string $state): Collection { - return $order->getPayments()->filter(function (PaymentInterface $payment) use ($state) { + /** @var Collection $payments */ + $payments = $order->getPayments()->filter(function (PaymentInterface $payment) use ($state) { return $state === $payment->getState(); }); + Assert::allIsInstanceOf($payments, PaymentInterface::class); + + return $payments; } } diff --git a/src/Sylius/Component/Core/spec/Model/OrderItemUnitSpec.php b/src/Sylius/Component/Core/spec/Model/OrderItemUnitSpec.php index 3f6fd7b788..06409ab3f1 100644 --- a/src/Sylius/Component/Core/spec/Model/OrderItemUnitSpec.php +++ b/src/Sylius/Component/Core/spec/Model/OrderItemUnitSpec.php @@ -19,9 +19,9 @@ use Sylius\Component\Core\Model\AdjustmentInterface; use Sylius\Component\Core\Model\OrderItemInterface; use Sylius\Component\Core\Model\OrderItemUnitInterface; use Sylius\Component\Core\Model\ProductVariantInterface; +use Sylius\Component\Core\Model\ShipmentInterface; use Sylius\Component\Inventory\Model\InventoryUnitInterface; use Sylius\Component\Order\Model\OrderItemUnit as BaseOrderItemUnit; -use Sylius\Component\Shipping\Model\ShipmentInterface; use Sylius\Component\Shipping\Model\ShipmentUnitInterface; final class OrderItemUnitSpec extends ObjectBehavior diff --git a/src/Sylius/Component/Payment/Resolver/DefaultPaymentMethodResolver.php b/src/Sylius/Component/Payment/Resolver/DefaultPaymentMethodResolver.php index 591161cfe8..f20ce873c1 100644 --- a/src/Sylius/Component/Payment/Resolver/DefaultPaymentMethodResolver.php +++ b/src/Sylius/Component/Payment/Resolver/DefaultPaymentMethodResolver.php @@ -17,6 +17,7 @@ use Sylius\Component\Payment\Exception\UnresolvedDefaultPaymentMethodException; use Sylius\Component\Payment\Model\PaymentInterface; use Sylius\Component\Payment\Model\PaymentMethodInterface; use Sylius\Component\Payment\Repository\PaymentMethodRepositoryInterface; +use Webmozart\Assert\Assert; final class DefaultPaymentMethodResolver implements DefaultPaymentMethodResolverInterface { @@ -33,7 +34,9 @@ final class DefaultPaymentMethodResolver implements DefaultPaymentMethodResolver if (empty($paymentMethods)) { throw new UnresolvedDefaultPaymentMethodException(); } + $paymentMethod = $paymentMethods[0]; + Assert::isInstanceOf($paymentMethod, PaymentMethodInterface::class); - return $paymentMethods[0]; + return $paymentMethod; } } diff --git a/src/Sylius/Component/Shipping/Resolver/DefaultShippingMethodResolver.php b/src/Sylius/Component/Shipping/Resolver/DefaultShippingMethodResolver.php index 4b72dc48fb..ff71877f87 100644 --- a/src/Sylius/Component/Shipping/Resolver/DefaultShippingMethodResolver.php +++ b/src/Sylius/Component/Shipping/Resolver/DefaultShippingMethodResolver.php @@ -17,6 +17,7 @@ use Sylius\Component\Shipping\Exception\UnresolvedDefaultShippingMethodException use Sylius\Component\Shipping\Model\ShipmentInterface; use Sylius\Component\Shipping\Model\ShippingMethodInterface; use Sylius\Component\Shipping\Repository\ShippingMethodRepositoryInterface; +use Webmozart\Assert\Assert; final class DefaultShippingMethodResolver implements DefaultShippingMethodResolverInterface { @@ -30,7 +31,9 @@ final class DefaultShippingMethodResolver implements DefaultShippingMethodResolv if (empty($shippingMethods)) { throw new UnresolvedDefaultShippingMethodException(); } + $shippingMethod = $shippingMethods[0]; + Assert::isInstanceOf($shippingMethod, ShippingMethodInterface::class); - return $shippingMethods[0]; + return $shippingMethod; } }