minor #14491 Upgrade PHPStan to level 3 (lruozzi9)

This PR was merged into the 1.12 branch.

Discussion
----------

| Q               | A                                                            |
|-----------------|--------------------------------------------------------------|
| Branch?         | 1.12 |
| Bug fix?        | no                                                      |
| New feature?    | no                                                      |
| BC breaks?      | no                                                      |
| Deprecations?   | no<!-- don't forget to update the UPGRADE-*.md file --> |
| Related tickets | partially #14019                      |
| License         | MIT                                                          |

Written during the journey to the SyliusCon, so lit 🔥 😆 

Commits
-------

67004338e1 [PHPStan] Bump to level 3 (#14019)
This commit is contained in:
Kevin Kaniaburka 2022-12-21 09:26:45 +01:00 committed by GitHub
commit cf8a0ecd26
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
36 changed files with 137 additions and 37 deletions

View file

@ -6,7 +6,7 @@ includes:
- vendor/phpstan/phpstan-symfony/rules.neon
parameters:
level: 2
level: 3
reportUnmatchedIgnoredErrors: false

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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;

View file

@ -68,7 +68,7 @@ final class ShippingMethodNormalizer implements ContextAwareNormalizerInterface,
}
if (!isset($filters['tokenValue']) || !isset($filters['shipmentId'])) {
return;
return null;
}
/** @var ChannelInterface $channel */

View file

@ -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();

View file

@ -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();

View file

@ -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;
}
}

View file

@ -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 */

View file

@ -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;
}
}

View file

@ -20,6 +20,7 @@ class GetStatus extends BaseGetStatus
{
/**
* @psalm-suppress NonInvariantDocblockPropertyType
* @phpstan-ignore-next-line
*
* @var string
*/

View file

@ -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;
}
}

View file

@ -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

View file

@ -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

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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;
}

View file

@ -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;
}
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -132,6 +132,8 @@ interface OrderInterface extends
* @psalm-return Collection<array-key, OrderItemInterface>
*
* @psalm-suppress ImplementedReturnTypeMismatch
*
* @phpstan-ignore-next-line
*/
public function getItems(): Collection;

View file

@ -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

View file

@ -41,6 +41,7 @@ class OrderItemUnit extends BaseOrderItemUnit implements OrderItemUnitInterface
public function setShipment(?BaseShipmentInterface $shipment): void
{
Assert::nullOrIsInstanceOf($shipment, ShipmentInterface::class);
$this->shipment = $shipment;
}

View file

@ -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;
}

View file

@ -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;
}
/**

View file

@ -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<array-key, ImageInterface> $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

View file

@ -41,6 +41,7 @@ class Promotion extends BasePromotion implements PromotionInterface
*/
public function getChannels(): Collection
{
/** @phpstan-ignore-next-line */
return $this->channels;
}

View file

@ -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;
}

View file

@ -70,6 +70,7 @@ class ShippingMethod extends BaseShippingMethod implements ShippingMethodInterfa
*/
public function getChannels(): Collection
{
/** @phpstan-ignore-next-line */
return $this->channels;
}

View file

@ -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;
}

View file

@ -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<array-key, PaymentInterface> $payments */
$payments = $order->getPayments()->filter(function (PaymentInterface $payment) use ($state) {
return $state === $payment->getState();
});
Assert::allIsInstanceOf($payments, PaymentInterface::class);
return $payments;
}
}

View file

@ -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

View file

@ -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;
}
}

View file

@ -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;
}
}