From 4fe06267c9314bef3b52489d13886adcf88dd2f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Mon, 26 Oct 2026 11:15:38 +0100 Subject: [PATCH] refactor: code quality via Rector, strict types where safe rector.php gets the codeQuality set: declare(strict_types=1) in the 85 files where Rector finds no call relying on scalar type juggling (mostly TCA and configuration, models, the content feed API and the import command), "or die" as "|| die", instanceof instead of null checks for object types, early returns and self:: in final classes. Hotel::setRooms() goes instead of getting the property Rector wanted to declare: nothing calls it, and there is no rooms column any more. Checked locally: cache warmup, the ep:* commands load, frontend crawl (~1,900 URLs) and the backchannel APIs render the same as before. Co-Authored-By: Claude Opus 5.5 --- .../Classes/Command/DateCommandController.php | 5 +++- .../Classes/ContentFeed/ContentFeedApi.php | 2 ++ .../Classes/ContentFeed/UrlResolver.php | 6 ++-- .../Classes/Controller/CityController.php | 2 +- .../Classes/Controller/ConceptController.php | 2 +- .../Classes/Controller/CountryController.php | 2 +- .../Classes/Controller/HotelController.php | 2 +- .../Classes/Controller/ProductController.php | 2 +- .../Classes/Controller/RegionController.php | 2 +- .../Classes/Controller/TeamController.php | 2 +- .../Controller/TravelinfoController.php | 2 +- .../Classes/Domain/Model/Badge.php | 3 +- .../ep_products/Classes/Domain/Model/City.php | 2 +- .../ep_products/Classes/Domain/Model/Fact.php | 2 ++ .../ep_products/Classes/Domain/Model/Faq.php | 4 ++- .../Classes/Domain/Model/Hotel.php | 9 +----- .../Classes/Domain/Model/Infobox.php | 3 +- .../Classes/Domain/Model/Journey.php | 2 ++ .../Classes/Domain/Model/MatchCode.php | 4 ++- .../Classes/Domain/Model/Officetip.php | 2 ++ .../Classes/Domain/Model/Product.php | 2 +- .../Classes/Domain/Model/Region.php | 2 +- .../ep_products/Classes/Domain/Model/Room.php | 2 ++ .../Classes/Domain/Model/TeaserInterface.php | 2 ++ .../Classes/Domain/Model/TravelinfoLink.php | 3 +- .../Classes/Domain/Model/TravelinfoTeaser.php | 3 +- .../Classes/Domain/Model/Webcam.php | 3 +- .../Domain/Repository/ConceptRepository.php | 2 ++ .../Domain/Repository/CountryRepository.php | 2 ++ .../Domain/Repository/HotelRepository.php | 2 +- .../Domain/Repository/ProductRepository.php | 2 +- .../Repository/SnowreportRepository.php | 2 +- .../Repository/TravelinfoRepository.php | 2 ++ .../Classes/Domain/Serialization/Services.php | 3 ++ .../ep_products/Classes/EpTeam/ApiClient.php | 15 +++++----- .../Classes/EpTeam/ApiException.php | 2 ++ .../Classes/Http/ApiKeyAuthenticator.php | 2 ++ .../ep_products/Classes/MyEP/ApiClient.php | 29 ++++++++++--------- .../ep_products/Classes/MyEP/ApiException.php | 2 ++ .../Routing/Aspect/PassthroughMapper.php | 4 ++- .../Classes/Service/ApiImportSource.php | 15 +++++----- .../Classes/Service/DateImportService.php | 6 ++-- .../Classes/Service/FilterService.php | 2 +- .../Classes/Service/GroupsSwissService.php | 2 +- .../Classes/Service/HotelImageService.php | 3 ++ .../Classes/Service/MyEpImageService.php | 11 +++++-- .../Classes/Service/PickupOverviewService.php | 4 ++- .../Classes/Service/ProductImageService.php | 3 ++ .../Classes/Service/ProductImport.php | 2 ++ .../Classes/Service/ProductImportSource.php | 2 ++ .../Classes/Utility/SerializationUtility.php | 8 ++--- .../Classes/Utility/TypeConversionUtility.php | 2 ++ packages/ep_products/Configuration/Icons.php | 2 ++ .../Configuration/RequestMiddlewares.php | 2 ++ .../TCA/Overrides/sys_template.php | 2 ++ .../TCA/Overrides/tt_content.php | 4 ++- .../tx_epproducts_domain_model_teammember.php | 4 ++- .../TCA/tx_epproducts_domain_model_badge.php | 3 ++ .../TCA/tx_epproducts_domain_model_city.php | 2 ++ .../tx_epproducts_domain_model_concept.php | 2 ++ .../tx_epproducts_domain_model_country.php | 2 ++ .../TCA/tx_epproducts_domain_model_date.php | 2 ++ .../TCA/tx_epproducts_domain_model_fact.php | 3 ++ .../TCA/tx_epproducts_domain_model_faq.php | 3 ++ ...products_domain_model_groupspriceboard.php | 3 ++ ...roducts_domain_model_groupspriceconfig.php | 2 ++ ...roducts_domain_model_groupspriceoption.php | 2 ++ .../TCA/tx_epproducts_domain_model_hotel.php | 2 ++ ..._epproducts_domain_model_hotel_mapping.php | 3 ++ .../tx_epproducts_domain_model_infobox.php | 3 ++ .../tx_epproducts_domain_model_journey.php | 2 ++ .../tx_epproducts_domain_model_matchcode.php | 3 ++ .../tx_epproducts_domain_model_officetip.php | 2 ++ .../tx_epproducts_domain_model_product.php | 2 ++ .../TCA/tx_epproducts_domain_model_region.php | 2 ++ .../tx_epproducts_domain_model_reseller.php | 3 ++ ...oducts_domain_model_staticsearchparams.php | 2 ++ .../tx_epproducts_domain_model_teammember.php | 2 ++ .../tx_epproducts_domain_model_travelinfo.php | 2 ++ ...epproducts_domain_model_travelinfolink.php | 3 ++ ...products_domain_model_travelinfoteaser.php | 2 ++ .../TCA/tx_epproducts_domain_model_webcam.php | 3 ++ packages/ep_products/ext_emconf.php | 2 ++ packages/ep_products/ext_localconf.php | 2 +- .../ep_theme/Classes/Domain/Model/Page.php | 2 ++ .../ep_theme/Classes/Form/BpnApiFinisher.php | 2 ++ .../Classes/Middleware/CdnImageMiddleware.php | 2 +- .../Classes/Middleware/ReferrerMiddleware.php | 2 ++ .../ViewHelpers/ContainerViewHelper.php | 6 ++-- .../Classes/ViewHelpers/IconViewHelper.php | 4 +-- .../Configuration/ContentSecurityPolicies.php | 2 ++ packages/ep_theme/Configuration/Icons.php | 2 ++ .../Configuration/RequestMiddlewares.php | 2 ++ .../Configuration/TCA/Overrides/pages.php | 4 ++- .../TCA/Overrides/sys_template.php | 4 ++- .../TCA/Overrides/tt_content.php | 4 ++- .../Overrides/tt_content_element_button.php | 4 ++- .../Overrides/tt_content_element_contact.php | 4 ++- .../tt_content_element_disrupter.php | 4 ++- .../tt_content_element_disturber.php | 4 ++- .../tt_content_element_faq_overview.php | 4 ++- .../TCA/Overrides/tt_content_element_gmap.php | 4 ++- .../Overrides/tt_content_element_lineup.php | 4 ++- .../Overrides/tt_content_element_teaser.php | 4 ++- .../Overrides/tt_content_element_ytvideo.php | 4 ++- .../TCA/Overrides/tt_content_preview.php | 4 ++- .../tx_eptheme_domain_model_badge.php | 2 ++ .../tx_eptheme_domain_model_slide.php | 2 ++ .../TCA/tx_eptheme_domain_model_disrupter.php | 2 ++ .../TCA/tx_eptheme_domain_model_lineup.php | 2 ++ .../TCA/tx_eptheme_domain_model_slide.php | 2 ++ packages/ep_theme/ext_emconf.php | 2 ++ packages/ep_theme/ext_localconf.php | 2 +- rector.php | 2 +- 114 files changed, 278 insertions(+), 98 deletions(-) diff --git a/packages/ep_products/Classes/Command/DateCommandController.php b/packages/ep_products/Classes/Command/DateCommandController.php index fdb14ce..3da9950 100644 --- a/packages/ep_products/Classes/Command/DateCommandController.php +++ b/packages/ep_products/Classes/Command/DateCommandController.php @@ -1,7 +1,10 @@ importSource->acquire(); - if ($import === null) { + if (!$import instanceof ProductImport) { $output->writeln('No new import available.'); return 0; } diff --git a/packages/ep_products/Classes/ContentFeed/ContentFeedApi.php b/packages/ep_products/Classes/ContentFeed/ContentFeedApi.php index af21030..282c6ef 100644 --- a/packages/ep_products/Classes/ContentFeed/ContentFeedApi.php +++ b/packages/ep_products/Classes/ContentFeed/ContentFeedApi.php @@ -1,5 +1,7 @@ getIncludedSite($pageUid); - if (null === $site) { + if (!$site instanceof Site) { return null; } @@ -152,7 +152,7 @@ class UrlResolver $pageUid = $this->parsePageReference($detailPage); $target = null === $pageUid ? null : $this->resolveLinkTarget($pageUid); $site = null === $target ? null : $this->getIncludedSite($target); - $url = null === $site ? null : $this->getPageUrl($target); + $url = $site instanceof Site ? $this->getPageUrl($target) : null; return [ 'url' => $url, @@ -170,7 +170,7 @@ class UrlResolver { $site = $this->getIncludedSite($storagePid); - if (null === $site) { + if (!$site instanceof Site) { return null; } diff --git a/packages/ep_products/Classes/Controller/CityController.php b/packages/ep_products/Classes/Controller/CityController.php index 09b2e0d..04136b6 100644 --- a/packages/ep_products/Classes/Controller/CityController.php +++ b/packages/ep_products/Classes/Controller/CityController.php @@ -22,7 +22,7 @@ class CityController extends ActionController */ public function detailAction(?City $city = null): ResponseInterface { - if (null === $city) { + if (!$city instanceof City) { $cityUid = ($this->settings['cityUid'] ?? ''); $city = $this->cityRepository->findByIdentifier($cityUid); } diff --git a/packages/ep_products/Classes/Controller/ConceptController.php b/packages/ep_products/Classes/Controller/ConceptController.php index 570cf25..8ea0e21 100644 --- a/packages/ep_products/Classes/Controller/ConceptController.php +++ b/packages/ep_products/Classes/Controller/ConceptController.php @@ -25,7 +25,7 @@ class ConceptController extends ActionController */ public function detailAction(?Concept $concept = null): ResponseInterface { - if ($concept === null) { + if (!$concept instanceof Concept) { $conceptUid = ($this->settings['conceptUid'] ?? ''); $concept = $this->conceptRepository->findByIdentifier($conceptUid); } diff --git a/packages/ep_products/Classes/Controller/CountryController.php b/packages/ep_products/Classes/Controller/CountryController.php index 95aa09a..35b5a22 100644 --- a/packages/ep_products/Classes/Controller/CountryController.php +++ b/packages/ep_products/Classes/Controller/CountryController.php @@ -23,7 +23,7 @@ class CountryController extends ActionController */ public function detailAction(?Country $country = null): ResponseInterface { - if ($country === null) { + if (!$country instanceof Country) { $countryUid = ($this->settings['countryUid'] ?? ''); $country = $this->countryRepository->findByIdentifier($countryUid); } diff --git a/packages/ep_products/Classes/Controller/HotelController.php b/packages/ep_products/Classes/Controller/HotelController.php index e702e67..47c5c42 100644 --- a/packages/ep_products/Classes/Controller/HotelController.php +++ b/packages/ep_products/Classes/Controller/HotelController.php @@ -28,7 +28,7 @@ class HotelController extends ActionController */ public function detailAction(?Hotel $hotel = null): ResponseInterface { - if ($hotel !== null) { + if ($hotel instanceof Hotel) { $hotelUid = $hotel->getUid(); } else { $hotelUid = ($this->settings['hotelUid'] ?? ''); diff --git a/packages/ep_products/Classes/Controller/ProductController.php b/packages/ep_products/Classes/Controller/ProductController.php index 19fc90f..72bb831 100644 --- a/packages/ep_products/Classes/Controller/ProductController.php +++ b/packages/ep_products/Classes/Controller/ProductController.php @@ -47,7 +47,7 @@ class ProductController extends ActionController $dateTo = null ): ResponseInterface { // Get product to display from flexform settings if not provided via url - if ($product === null) { + if (!$product instanceof Product) { $productUid = ($this->settings['productUid'] ?? null); $product = $productUid ? $this->productRepository->findByIdentifier($productUid) : null; } diff --git a/packages/ep_products/Classes/Controller/RegionController.php b/packages/ep_products/Classes/Controller/RegionController.php index 667fb03..8da5189 100644 --- a/packages/ep_products/Classes/Controller/RegionController.php +++ b/packages/ep_products/Classes/Controller/RegionController.php @@ -23,7 +23,7 @@ class RegionController extends ActionController */ public function detailAction(?Region $region = null): ResponseInterface { - if ($region === null) { + if (!$region instanceof Region) { $regionUid = ($this->settings['regionUid'] ?? ''); $region = $this->regionRepository->findByIdentifier($regionUid); } diff --git a/packages/ep_products/Classes/Controller/TeamController.php b/packages/ep_products/Classes/Controller/TeamController.php index c6da104..e04de23 100644 --- a/packages/ep_products/Classes/Controller/TeamController.php +++ b/packages/ep_products/Classes/Controller/TeamController.php @@ -33,7 +33,7 @@ class TeamController extends ActionController */ public function showAction(?Teammember $member = null): ResponseInterface { - if ($member === null) { + if (!$member instanceof Teammember) { return $this->redirect('list', null, null, null, null, 0, 302); } diff --git a/packages/ep_products/Classes/Controller/TravelinfoController.php b/packages/ep_products/Classes/Controller/TravelinfoController.php index 8782f05..2b18f90 100644 --- a/packages/ep_products/Classes/Controller/TravelinfoController.php +++ b/packages/ep_products/Classes/Controller/TravelinfoController.php @@ -45,7 +45,7 @@ class TravelinfoController extends ActionController public function travelInfoAction(?Travelinfo $travelInfo = null): ResponseInterface { // the page itself (/reiseinformationen/) without a travel info or code - if (null === $travelInfo) { + if (!$travelInfo instanceof Travelinfo) { $this->notFound(); } diff --git a/packages/ep_products/Classes/Domain/Model/Badge.php b/packages/ep_products/Classes/Domain/Model/Badge.php index 644313e..06bd84d 100644 --- a/packages/ep_products/Classes/Domain/Model/Badge.php +++ b/packages/ep_products/Classes/Domain/Model/Badge.php @@ -1,5 +1,7 @@ headerImages; if ($headerImages->count() === 0 && null !== $this->getRegion()) { - $headerImages = $this->getRegion()->getHeaderImages(); + return $this->getRegion()->getHeaderImages(); } return $headerImages; diff --git a/packages/ep_products/Classes/Domain/Model/Fact.php b/packages/ep_products/Classes/Domain/Model/Fact.php index 000048c..6901be4 100644 --- a/packages/ep_products/Classes/Domain/Model/Fact.php +++ b/packages/ep_products/Classes/Domain/Model/Fact.php @@ -1,5 +1,7 @@ answer = $answer; } -} \ No newline at end of file +} diff --git a/packages/ep_products/Classes/Domain/Model/Hotel.php b/packages/ep_products/Classes/Domain/Model/Hotel.php index 9a2ee36..0da1cb1 100644 --- a/packages/ep_products/Classes/Domain/Model/Hotel.php +++ b/packages/ep_products/Classes/Domain/Model/Hotel.php @@ -721,7 +721,7 @@ class Hotel extends AbstractEntity implements TeaserInterface $headerImages = $this->headerImages; if ($headerImages->count() === 0 && null !== $this->getCity()) { - $headerImages = $this->getCity()->getHeaderImages(); + return $this->getCity()->getHeaderImages(); } return $headerImages; @@ -920,13 +920,6 @@ class Hotel extends AbstractEntity implements TeaserInterface $this->products = $products; } - /** - * @param ObjectStorage $rooms - */ - public function setRooms($rooms) { - $this->rooms = $rooms; - } - public function addFact(Fact $fact) { $this->facts->attach($fact); diff --git a/packages/ep_products/Classes/Domain/Model/Infobox.php b/packages/ep_products/Classes/Domain/Model/Infobox.php index d7884b5..59107aa 100644 --- a/packages/ep_products/Classes/Domain/Model/Infobox.php +++ b/packages/ep_products/Classes/Domain/Model/Infobox.php @@ -1,5 +1,7 @@ defaultText = $defaultText; } } - diff --git a/packages/ep_products/Classes/Domain/Model/Journey.php b/packages/ep_products/Classes/Domain/Model/Journey.php index 6e57588..37cc852 100644 --- a/packages/ep_products/Classes/Domain/Model/Journey.php +++ b/packages/ep_products/Classes/Domain/Model/Journey.php @@ -1,5 +1,7 @@ code = $code; } -} \ No newline at end of file +} diff --git a/packages/ep_products/Classes/Domain/Model/Officetip.php b/packages/ep_products/Classes/Domain/Model/Officetip.php index c391933..ecb26ff 100644 --- a/packages/ep_products/Classes/Domain/Model/Officetip.php +++ b/packages/ep_products/Classes/Domain/Model/Officetip.php @@ -1,5 +1,7 @@ headerImages; if ($headerImages->count() === 0 && null !== $this->getRegion()) { - $headerImages = $this->getRegion()->getHeaderImages(); + return $this->getRegion()->getHeaderImages(); } return $headerImages; diff --git a/packages/ep_products/Classes/Domain/Model/Region.php b/packages/ep_products/Classes/Domain/Model/Region.php index d0d11a9..63c7325 100644 --- a/packages/ep_products/Classes/Domain/Model/Region.php +++ b/packages/ep_products/Classes/Domain/Model/Region.php @@ -265,7 +265,7 @@ class Region extends AbstractDestination implements TeaserInterface $headerImages = $this->headerImages; if ($headerImages->count() === 0 && null !== $this->getCountry()) { - $headerImages = $this->getCountry()->getHeaderImages(); + return $this->getCountry()->getHeaderImages(); } return $headerImages; diff --git a/packages/ep_products/Classes/Domain/Model/Room.php b/packages/ep_products/Classes/Domain/Model/Room.php index 8988aa2..3f2459f 100644 --- a/packages/ep_products/Classes/Domain/Model/Room.php +++ b/packages/ep_products/Classes/Domain/Model/Room.php @@ -1,5 +1,7 @@ icon = $icon; } } - diff --git a/packages/ep_products/Classes/Domain/Model/TravelinfoTeaser.php b/packages/ep_products/Classes/Domain/Model/TravelinfoTeaser.php index ae15345..4a0be19 100644 --- a/packages/ep_products/Classes/Domain/Model/TravelinfoTeaser.php +++ b/packages/ep_products/Classes/Domain/Model/TravelinfoTeaser.php @@ -1,5 +1,7 @@ image = $image; } } - diff --git a/packages/ep_products/Classes/Domain/Model/Webcam.php b/packages/ep_products/Classes/Domain/Model/Webcam.php index 29c9dba..a738a23 100644 --- a/packages/ep_products/Classes/Domain/Model/Webcam.php +++ b/packages/ep_products/Classes/Domain/Model/Webcam.php @@ -1,5 +1,7 @@ available = $available; } } - diff --git a/packages/ep_products/Classes/Domain/Repository/ConceptRepository.php b/packages/ep_products/Classes/Domain/Repository/ConceptRepository.php index 102515a..c2c0645 100644 --- a/packages/ep_products/Classes/Domain/Repository/ConceptRepository.php +++ b/packages/ep_products/Classes/Domain/Repository/ConceptRepository.php @@ -1,5 +1,7 @@ getConcreteQueryBuilder()->orderBy('FIELD(hotel.type, ' . Hotel::TYPE_SPORTS_CLUB . ') DESC'); $qb->addOrderBy('hotel.name', 'ASC'); - if ($excludedHotelUids) { + if ($excludedHotelUids !== []) { $qb ->andWhere('hotel.uid NOT IN (:excludedHotelUids)') ->setParameter('excludedHotelUids', $excludedHotelUids, Connection::PARAM_INT_ARRAY) diff --git a/packages/ep_products/Classes/Domain/Repository/ProductRepository.php b/packages/ep_products/Classes/Domain/Repository/ProductRepository.php index 714448c..b4065c1 100644 --- a/packages/ep_products/Classes/Domain/Repository/ProductRepository.php +++ b/packages/ep_products/Classes/Domain/Repository/ProductRepository.php @@ -244,7 +244,7 @@ class ProductRepository extends AbstractRepository ); } - if ($date !== null) { + if ($date instanceof Date) { $qb->andWhere($qb->expr()->eq( 'date.uid', $qb->createNamedParameter($date->getUid(), Connection::PARAM_INT)) diff --git a/packages/ep_products/Classes/Domain/Repository/SnowreportRepository.php b/packages/ep_products/Classes/Domain/Repository/SnowreportRepository.php index a13080b..4f502df 100644 --- a/packages/ep_products/Classes/Domain/Repository/SnowreportRepository.php +++ b/packages/ep_products/Classes/Domain/Repository/SnowreportRepository.php @@ -31,7 +31,7 @@ class SnowreportRepository extends AbstractRepository ->orderBy('region.name') ; - if ($regionUids) { + if ($regionUids !== []) { $qb->andWhere($qb->expr()->in( 'region.uid', $qb->createNamedParameter($regionUids, Connection::PARAM_INT_ARRAY) diff --git a/packages/ep_products/Classes/Domain/Repository/TravelinfoRepository.php b/packages/ep_products/Classes/Domain/Repository/TravelinfoRepository.php index f62f188..12b40cc 100644 --- a/packages/ep_products/Classes/Domain/Repository/TravelinfoRepository.php +++ b/packages/ep_products/Classes/Domain/Repository/TravelinfoRepository.php @@ -1,5 +1,7 @@ self::ERROR_BODY_EXCERPT_LENGTH) { - $body = mb_substr($body, 0, self::ERROR_BODY_EXCERPT_LENGTH) . '…'; + return mb_substr($body, 0, self::ERROR_BODY_EXCERPT_LENGTH) . '…'; } return $body; @@ -157,7 +158,7 @@ class ApiClient implements LoggerAwareInterface return; } - if (null !== $this->logger) { + if ($this->logger instanceof LoggerInterface) { $this->logger->info('Application form submission accepted by the EP Team API.', [ 'form' => $payload['form'] ?? null, 'pageUid' => $payload['pageUid'] ?? null, @@ -171,8 +172,8 @@ class ApiClient implements LoggerAwareInterface */ private function getHttpClient(): HttpClientInterface { - if (null !== static::$httpClient) { - return static::$httpClient; + if (self::$httpClient instanceof HttpClientInterface) { + return self::$httpClient; } $config = $this->getConfiguration(); @@ -215,7 +216,7 @@ class ApiClient implements LoggerAwareInterface $options['max_duration'] = $maxDuration; } - return static::$httpClient = HttpClient::createForBaseUri(rtrim($baseUrl, '/') . '/', $options); + return self::$httpClient = HttpClient::createForBaseUri(rtrim($baseUrl, '/') . '/', $options); } private function getConfiguration(): array @@ -228,14 +229,14 @@ class ApiClient implements LoggerAwareInterface private function logError(string $message, array $context = []): void { - if (null !== $this->logger) { + if ($this->logger instanceof LoggerInterface) { $this->logger->error($message, $context); } } private function logWarning(string $message, array $context = []): void { - if (null !== $this->logger) { + if ($this->logger instanceof LoggerInterface) { $this->logger->warning($message, $context); } } diff --git a/packages/ep_products/Classes/EpTeam/ApiException.php b/packages/ep_products/Classes/EpTeam/ApiException.php index e0d7d2c..dcf44e2 100644 --- a/packages/ep_products/Classes/EpTeam/ApiException.php +++ b/packages/ep_products/Classes/EpTeam/ApiException.php @@ -1,5 +1,7 @@ getConfiguration(); @@ -373,7 +374,7 @@ class ApiClient implements LoggerAwareInterface $options['max_duration'] = $maxDuration; } - return static::$httpClient = HttpClient::createForBaseUri($config['myEpApiBaseUrl'], $options); + return self::$httpClient = HttpClient::createForBaseUri($config['myEpApiBaseUrl'], $options); } /** @@ -404,8 +405,8 @@ class ApiClient implements LoggerAwareInterface */ private function getAccessToken(array $config): AccessToken { - if ($this->isTokenUsable(static::$accessToken)) { - return static::$accessToken; + if ($this->isTokenUsable(self::$accessToken)) { + return self::$accessToken; } // The static above only lives for one PHP request, so without this second level every @@ -414,15 +415,15 @@ class ApiClient implements LoggerAwareInterface if (is_array($cachedToken) && isset($cachedToken['access_token'])) { $token = new AccessToken($cachedToken); if ($this->isTokenUsable($token)) { - static::$accessToken = $token; + self::$accessToken = $token; - return static::$accessToken; + return self::$accessToken; } } try { - static::$accessToken = $this->normalizeToken($this->getProvider($config)->getAccessToken('client_credentials')); - $this->cacheAccessToken(static::$accessToken); + self::$accessToken = $this->normalizeToken($this->getProvider($config)->getAccessToken('client_credentials')); + $this->cacheAccessToken(self::$accessToken); } catch (IdentityProviderException $e) { $message = sprintf('MyEP OAuth token request failed: %s', $e->getMessage()); $this->logError($message, ['exception' => $e]); @@ -437,7 +438,7 @@ class ApiClient implements LoggerAwareInterface throw new ApiException($message, 0, $e); } - return static::$accessToken; + return self::$accessToken; } /** @@ -448,7 +449,7 @@ class ApiClient implements LoggerAwareInterface */ private function isTokenUsable(?AccessToken $token): bool { - if (null === $token) { + if (!$token instanceof AccessToken) { return false; } @@ -477,7 +478,7 @@ class ApiClient implements LoggerAwareInterface private function discardAccessToken(): void { - static::$accessToken = null; + self::$accessToken = null; $this->getCache()->remove(self::ACCESS_TOKEN_CACHE_IDENTIFIER); } @@ -515,14 +516,14 @@ class ApiClient implements LoggerAwareInterface private function logError(string $message, array $context = []): void { - if (null !== $this->logger) { + if ($this->logger instanceof LoggerInterface) { $this->logger->error($message, $context); } } private function logWarning(string $message, array $context = []): void { - if (null !== $this->logger) { + if ($this->logger instanceof LoggerInterface) { $this->logger->warning($message, $context); } } diff --git a/packages/ep_products/Classes/MyEP/ApiException.php b/packages/ep_products/Classes/MyEP/ApiException.php index b59a70c..17651fa 100644 --- a/packages/ep_products/Classes/MyEP/ApiException.php +++ b/packages/ep_products/Classes/MyEP/ApiException.php @@ -1,5 +1,7 @@ getImportedTimestamp(); - if ($baseline !== null && $sourceGeneratedAt <= $baseline) { + if ($baseline instanceof \DateTimeImmutable && $sourceGeneratedAt <= $baseline) { return null; } @@ -81,7 +82,7 @@ final class ApiImportSource implements ProductImportSource, SingletonInterface, public function markImported(ProductImport $import): void { $sourceGeneratedAt = $import->getSourceGeneratedAt(); - if ($sourceGeneratedAt !== null) { + if ($sourceGeneratedAt instanceof \DateTimeImmutable) { $file = $this->baselinePath(); GeneralUtility::mkdir_deep(dirname($file)); GeneralUtility::writeFile($file, $sourceGeneratedAt->format(\DateTimeInterface::ATOM), false); @@ -98,13 +99,13 @@ final class ApiImportSource implements ProductImportSource, SingletonInterface, public function isNewImportAvailable(): bool { $lastUpdateAt = $this->getApiClient()->getLastUpdateAt(); - if ($lastUpdateAt === null) { + if (!$lastUpdateAt instanceof \DateTimeImmutable) { return false; } $baseline = $this->getImportedTimestamp(); - return $baseline === null || $lastUpdateAt > $baseline; + return !$baseline instanceof \DateTimeImmutable || $lastUpdateAt > $baseline; } /** @@ -141,12 +142,12 @@ final class ApiImportSource implements ProductImportSource, SingletonInterface, $pageGeneratedAt = $this->parseTimestamp($meta['sourceGeneratedAt'] ?? null); if ($page === 1) { - if ($pageGeneratedAt === null) { + if (!$pageGeneratedAt instanceof \DateTimeImmutable) { $this->logWarning('MyE&P product export has no source timestamp; skipping product import'); return null; } $sourceGeneratedAt = $pageGeneratedAt; - } elseif ($pageGeneratedAt === null || $pageGeneratedAt != $sourceGeneratedAt) { + } elseif (!$pageGeneratedAt instanceof \DateTimeImmutable || $pageGeneratedAt != $sourceGeneratedAt) { $this->logWarning('MyE&P product export changed during the page walk; restarting', [ 'page' => $page, 'expected' => $sourceGeneratedAt->format(\DateTimeInterface::ATOM), @@ -215,7 +216,7 @@ final class ApiImportSource implements ProductImportSource, SingletonInterface, private function logWarning(string $message, array $context = []): void { - if ($this->logger !== null) { + if ($this->logger instanceof LoggerInterface) { $this->logger->warning($message, $context); } } diff --git a/packages/ep_products/Classes/Service/DateImportService.php b/packages/ep_products/Classes/Service/DateImportService.php index 7367ad1..be7b7a8 100644 --- a/packages/ep_products/Classes/Service/DateImportService.php +++ b/packages/ep_products/Classes/Service/DateImportService.php @@ -241,7 +241,7 @@ class DateImportService implements SingletonInterface, LoggerAwareInterface // Import daytrip dates only once per hotel as room information is taken // from contingents - if ($product['daytrip'] && \in_array($key, static::$cache['datesAdded'], true)) { + if ($product['daytrip'] && \in_array($key, self::$cache['datesAdded'], true)) { continue; } @@ -259,7 +259,7 @@ class DateImportService implements SingletonInterface, LoggerAwareInterface $dateCount++; } - static::$cache['datesAdded'][] = $key; + self::$cache['datesAdded'][] = $key; } $this->db->update( 'tx_epproducts_domain_model_product', @@ -344,7 +344,7 @@ class DateImportService implements SingletonInterface, LoggerAwareInterface $date['services_included'] = serialize($includedServices); $date['courses_included'] = serialize($includedCourses); - if ($includedBoard) { + if ($includedBoard !== []) { $date['board'] = implode(', ', $includedBoard); $date['board_bus_pro_id'] = key($includedBoard); } diff --git a/packages/ep_products/Classes/Service/FilterService.php b/packages/ep_products/Classes/Service/FilterService.php index 51cba05..fbfc59a 100644 --- a/packages/ep_products/Classes/Service/FilterService.php +++ b/packages/ep_products/Classes/Service/FilterService.php @@ -297,7 +297,7 @@ class FilterService implements SingletonInterface $filterSettings['hotelUid'] = $settings['hotelUid']; } $conceptUids = GeneralUtility::intExplode(',', $settings['conceptUid'], true); - if ($conceptUids) { + if ($conceptUids !== []) { $filterSettings['conceptUids'] = $conceptUids; } if (isset($settings['dateFrom']) && (int) $settings['dateFrom'] > 0) { diff --git a/packages/ep_products/Classes/Service/GroupsSwissService.php b/packages/ep_products/Classes/Service/GroupsSwissService.php index 357a70e..802543c 100644 --- a/packages/ep_products/Classes/Service/GroupsSwissService.php +++ b/packages/ep_products/Classes/Service/GroupsSwissService.php @@ -107,7 +107,7 @@ class GroupsSwissService implements LoggerAwareInterface $current = null; $lastDate = null; foreach ($rows as $row) { - $isGap = null !== $lastDate && $row['date'] > $lastDate->modify('+1 day'); + $isGap = $lastDate instanceof \DateTimeImmutable && $row['date'] > $lastDate->modify('+1 day'); if (null !== $current && ($isGap || 'OK' === $row['status'] || $current['status'] !== $row['status'])) { $ranges[] = $current; $current = null; diff --git a/packages/ep_products/Classes/Service/HotelImageService.php b/packages/ep_products/Classes/Service/HotelImageService.php index 9231769..580e070 100644 --- a/packages/ep_products/Classes/Service/HotelImageService.php +++ b/packages/ep_products/Classes/Service/HotelImageService.php @@ -1,4 +1,7 @@ table = $table; } diff --git a/packages/ep_products/Classes/Service/PickupOverviewService.php b/packages/ep_products/Classes/Service/PickupOverviewService.php index 38f639f..9acaa69 100644 --- a/packages/ep_products/Classes/Service/PickupOverviewService.php +++ b/packages/ep_products/Classes/Service/PickupOverviewService.php @@ -1,5 +1,7 @@ []]; - if ($hotel === null || $product->isDaytrip()) { + if (!$hotel instanceof Hotel || $product->isDaytrip()) { return $overview; } diff --git a/packages/ep_products/Classes/Service/ProductImageService.php b/packages/ep_products/Classes/Service/ProductImageService.php index 77fa572..d283892 100644 --- a/packages/ep_products/Classes/Service/ProductImageService.php +++ b/packages/ep_products/Classes/Service/ProductImageService.php @@ -1,4 +1,7 @@ getOriginalFile()->getPublicUrl(); } else { - $imageService = static::getImageService(); + $imageService = self::getImageService(); $cropString = $image->getProperty('crop'); $cropVariantCollection = CropVariantCollection::create($cropString); $cropVariant = $processingInstructions['cropVariant'] ?: 'default'; @@ -70,11 +70,11 @@ class SerializationUtility */ private static function getImageService() { - if (static::$imageService === null) { - static::$imageService = GeneralUtility::makeInstance(ImageService::class); + if (self::$imageService === null) { + self::$imageService = GeneralUtility::makeInstance(ImageService::class); } - return static::$imageService; + return self::$imageService; } } diff --git a/packages/ep_products/Classes/Utility/TypeConversionUtility.php b/packages/ep_products/Classes/Utility/TypeConversionUtility.php index a76df04..c0566a4 100644 --- a/packages/ep_products/Classes/Utility/TypeConversionUtility.php +++ b/packages/ep_products/Classes/Utility/TypeConversionUtility.php @@ -1,5 +1,7 @@ [ 'title' => 'LLL:EXT:ep_products/Resources/Private/Language/locallang.xlf:tx_epproducts_domain_model_badge', diff --git a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_city.php b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_city.php index d422cbf..34a7ca7 100644 --- a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_city.php +++ b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_city.php @@ -1,5 +1,7 @@ [ 'title' => 'LLL:EXT:ep_products/Resources/Private/Language/locallang.xlf:tx_epproducts_domain_model_fact', diff --git a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_faq.php b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_faq.php index 78e67bf..9b038a0 100644 --- a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_faq.php +++ b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_faq.php @@ -1,4 +1,7 @@ [ 'title' => 'LLL:EXT:ep_products/Resources/Private/Language/locallang.xlf:tx_epproducts_domain_model_faq', diff --git a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_groupspriceboard.php b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_groupspriceboard.php index c557a2e..d78b156 100644 --- a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_groupspriceboard.php +++ b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_groupspriceboard.php @@ -1,4 +1,7 @@ [ 'title' => 'Verpflegungsleistung', diff --git a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_groupspriceconfig.php b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_groupspriceconfig.php index 9d40a39..8b37d91 100644 --- a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_groupspriceconfig.php +++ b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_groupspriceconfig.php @@ -1,5 +1,7 @@ [ 'title' => 'Hotelmapping', diff --git a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_infobox.php b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_infobox.php index eaa7fc1..d986444 100644 --- a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_infobox.php +++ b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_infobox.php @@ -1,4 +1,7 @@ [ 'title' => 'LLL:EXT:ep_products/Resources/Private/Language/locallang.xlf:tx_epproducts_domain_model_infobox', diff --git a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_journey.php b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_journey.php index 8ee118d..9222db7 100644 --- a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_journey.php +++ b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_journey.php @@ -1,5 +1,7 @@ [ 'title' => 'LLL:EXT:ep_products/Resources/Private/Language/locallang.xlf:tx_epproducts_domain_model_matchcode', diff --git a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_officetip.php b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_officetip.php index e1d7247..ef7960f 100644 --- a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_officetip.php +++ b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_officetip.php @@ -1,5 +1,7 @@ [ 'title' => 'LLL:EXT:ep_products/Resources/Private/Language/locallang.xlf:tx_epproducts_domain_model_reseller', diff --git a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_staticsearchparams.php b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_staticsearchparams.php index f5c0aa7..f85865a 100644 --- a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_staticsearchparams.php +++ b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_staticsearchparams.php @@ -1,5 +1,7 @@ [ 'title' => 'Reiseinfo Link', diff --git a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_travelinfoteaser.php b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_travelinfoteaser.php index d846836..4e0a2a1 100644 --- a/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_travelinfoteaser.php +++ b/packages/ep_products/Configuration/TCA/tx_epproducts_domain_model_travelinfoteaser.php @@ -1,5 +1,7 @@ [ 'title' => 'LLL:EXT:ep_products/Resources/Private/Language/locallang.xlf:tx_epproducts_domain_model_webcam', diff --git a/packages/ep_products/ext_emconf.php b/packages/ep_products/ext_emconf.php index 8828923..42af5e3 100644 --- a/packages/ep_products/ext_emconf.php +++ b/packages/ep_products/ext_emconf.php @@ -1,5 +1,7 @@ 'E&P Products', 'description' => 'Implementation of all product related logic and models', diff --git a/packages/ep_products/ext_localconf.php b/packages/ep_products/ext_localconf.php index 2c57e48..359b28d 100644 --- a/packages/ep_products/ext_localconf.php +++ b/packages/ep_products/ext_localconf.php @@ -27,7 +27,7 @@ use EP\EpProducts\Routing\Aspect\PassthroughMapper; use TYPO3\CMS\Core\Log\LogLevel; use EP\EpProducts\Log\Writer; -defined('TYPO3') or die('Access denied.'); +defined('TYPO3') || die('Access denied.'); $boot = function () { if (!is_array($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['ep_products_cache'] ?? null)) { diff --git a/packages/ep_theme/Classes/Domain/Model/Page.php b/packages/ep_theme/Classes/Domain/Model/Page.php index 1d92b5d..8741b84 100644 --- a/packages/ep_theme/Classes/Domain/Model/Page.php +++ b/packages/ep_theme/Classes/Domain/Model/Page.php @@ -1,5 +1,7 @@ extensionConfiguration->get('ep_theme', 'cdnBaseUrl') ?? ''), '/'); $contentType = $response->getHeaderLine('Content-Type'); if ($cdnBaseUrl === '' - || !(str_starts_with($contentType, 'text/html') || str_starts_with($contentType, 'application/json')) + || !str_starts_with($contentType, 'text/html') && !str_starts_with($contentType, 'application/json') ) { return $response; } diff --git a/packages/ep_theme/Classes/Middleware/ReferrerMiddleware.php b/packages/ep_theme/Classes/Middleware/ReferrerMiddleware.php index f30d5a9..6ddd503 100644 --- a/packages/ep_theme/Classes/Middleware/ReferrerMiddleware.php +++ b/packages/ep_theme/Classes/Middleware/ReferrerMiddleware.php @@ -1,5 +1,7 @@ renderChildren(); $content ??= $this->arguments['content']; $classes = []; - if (\in_array($this->arguments['data']['colPos'] ?? null, static::$columnsWithoutContainers, false)) { + if (\in_array($this->arguments['data']['colPos'] ?? null, self::$columnsWithoutContainers, false)) { $classes[] = 'container'; } if ($this->arguments['cssClasses'] !== null) { $classes[] = $this->arguments['cssClasses']; } if (!empty($this->arguments['data']['space_before_class'])) { - $scaleTop = static::$scale[$this->arguments['data']['space_before_class']]; + $scaleTop = self::$scale[$this->arguments['data']['space_before_class']]; $classes[] = sprintf('pt-%d', $scaleTop); } if (!empty($this->arguments['data']['space_after_class'])) { - $scaleBottom = static::$scale[$this->arguments['data']['space_after_class']]; + $scaleBottom = self::$scale[$this->arguments['data']['space_after_class']]; $classes[] = sprintf('pb-%d', $scaleBottom); } if ('default' !== ($this->arguments['data']['frame_class'] ?? null)) { diff --git a/packages/ep_theme/Classes/ViewHelpers/IconViewHelper.php b/packages/ep_theme/Classes/ViewHelpers/IconViewHelper.php index 68329e8..2b69247 100644 --- a/packages/ep_theme/Classes/ViewHelpers/IconViewHelper.php +++ b/packages/ep_theme/Classes/ViewHelpers/IconViewHelper.php @@ -22,7 +22,7 @@ class IconViewHelper extends AbstractTagBasedViewHelper public function render(): string { - $imageService = self::getImageService(); + $imageService = $this->getImageService(); $sprite = $imageService->getImage('EXT:ep_theme/Resources/Public/images/icons_sprite.svg', null, false); $imageUrl = $sprite->getPublicUrl(); @@ -33,7 +33,7 @@ class IconViewHelper extends AbstractTagBasedViewHelper return $this->tag->render(); } - private static function getImageService() + private function getImageService() { return GeneralUtility::makeInstance(ImageService::class); } diff --git a/packages/ep_theme/Configuration/ContentSecurityPolicies.php b/packages/ep_theme/Configuration/ContentSecurityPolicies.php index 7a4956a..bb46b99 100644 --- a/packages/ep_theme/Configuration/ContentSecurityPolicies.php +++ b/packages/ep_theme/Configuration/ContentSecurityPolicies.php @@ -1,5 +1,7 @@ .html); loads after tt_content_element_*.php foreach (['teaser_country', 'teaser_region', 'teaser_city', 'teaser_hotel', 'teaser_concept', 'teaser_product', diff --git a/packages/ep_theme/Configuration/TCA/Overrides/tx_eptheme_domain_model_badge.php b/packages/ep_theme/Configuration/TCA/Overrides/tx_eptheme_domain_model_badge.php index bc4aa20..de9cba7 100644 --- a/packages/ep_theme/Configuration/TCA/Overrides/tx_eptheme_domain_model_badge.php +++ b/packages/ep_theme/Configuration/TCA/Overrides/tx_eptheme_domain_model_badge.php @@ -1,3 +1,5 @@ 'E&P Theme', 'description' => 'Theme package for Ep Reisen TYPO3 website', diff --git a/packages/ep_theme/ext_localconf.php b/packages/ep_theme/ext_localconf.php index c66a9e0..bcae1e3 100644 --- a/packages/ep_theme/ext_localconf.php +++ b/packages/ep_theme/ext_localconf.php @@ -5,7 +5,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\MetaTag\MetaTagManagerRegistry; use EP\EpTheme\MetaTag\OpenGraphMetaTagManager; -defined('TYPO3') or die(); +defined('TYPO3') || die(); $boot = function () { $GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['namespaces']['ep'] = ['Ep\\EpTheme\\ViewHelpers']; diff --git a/rector.php b/rector.php index 8ab9d94..30ee571 100644 --- a/rector.php +++ b/rector.php @@ -28,7 +28,7 @@ return RectorConfig::configure() ]) ->withPhpVersion(PhpVersion::PHP_85) ->withPhpSets(php85: true) - ->withPreparedSets(deadCode: true) + ->withPreparedSets(deadCode: true, codeQuality: true) ->withSets([ Typo3SetList::GENERAL, Typo3LevelSetList::UP_TO_TYPO3_13,