diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 31d59d8..643b8cd 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -56,9 +56,12 @@ jobs: key: ${{ runner.os }}-composer-2.4.8-${{ hashFiles('**/composer.json') }} restore-keys: ${{ runner.os }}-composer-2.4.8 - - name: Clone Magento + - name: Download Magento run: | - git clone --depth=1 --branch=2.4.8 https://github.com/magento/magento2.git magento2 + composer create-project \ + --repository-url=https://mirror.mage-os.org/ \ + magento/project-community-edition \ + magento2 - name: Install Magento working-directory: magento2 @@ -109,11 +112,9 @@ jobs: composer update --with-dependencies # Enable module - bin/magento module:enable OpenForgeProject_MageForge bin/magento setup:upgrade - name: Run PHPStan working-directory: magento2 - continue-on-error: true run: | vendor/bin/phpstan analyse -c vendor/openforgeproject/mageforge/phpstan.neon vendor/openforgeproject/mageforge/src diff --git a/phpstan.neon b/phpstan.neon index 6e451fa..91e6453 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,4 +1,4 @@ parameters: - level: 6 + level: 5 paths: - src diff --git a/src/Block/Inspector.php b/src/Block/Inspector.php index 71c7af6..d0c0da9 100644 --- a/src/Block/Inspector.php +++ b/src/Block/Inspector.php @@ -19,29 +19,13 @@ class Inspector extends Template { private const XML_PATH_INSPECTOR_ENABLED = 'dev/mageforge_inspector/enabled'; - private State $state; - - private ScopeConfigInterface $scopeConfig; - - private DevHelper $devHelper; - - /** - * @param Context $context - * @param State $state - * @param ScopeConfigInterface $scopeConfig - * @param DevHelper $devHelper - * @param array $data - */ public function __construct( Context $context, - State $state, - ScopeConfigInterface $scopeConfig, - DevHelper $devHelper, + private readonly State $state, + private readonly ScopeConfigInterface $scopeConfig, + private readonly DevHelper $devHelper, array $data = [] ) { - $this->state = $state; - $this->scopeConfig = $scopeConfig; - $this->devHelper = $devHelper; parent::__construct($context, $data); } diff --git a/src/Console/Command/Dev/InspectorCommand.php b/src/Console/Command/Dev/InspectorCommand.php index a5ce56b..a21cbb9 100644 --- a/src/Console/Command/Dev/InspectorCommand.php +++ b/src/Console/Command/Dev/InspectorCommand.php @@ -21,27 +21,12 @@ class InspectorCommand extends AbstractCommand private const XML_PATH_INSPECTOR_ENABLED = 'dev/mageforge_inspector/enabled'; private const ARGUMENT_ACTION = 'action'; - private WriterInterface $configWriter; - - private State $state; - - private CacheManager $cacheManager; - - /** - * @param WriterInterface $configWriter - * @param State $state - * @param CacheManager $cacheManager - * @param string|null $name - */ public function __construct( - WriterInterface $configWriter, - State $state, - CacheManager $cacheManager, + private readonly WriterInterface $configWriter, + private readonly State $state, + private readonly CacheManager $cacheManager, ?string $name = null ) { - $this->configWriter = $configWriter; - $this->state = $state; - $this->cacheManager = $cacheManager; parent::__construct($name); } @@ -116,7 +101,6 @@ protected function executeCommand(InputInterface $input, OutputInterface $output 'enable' => $this->enableInspector(), 'disable' => $this->disableInspector(), 'status' => $this->showStatus(), - default => Cli::RETURN_FAILURE, }; } diff --git a/src/Console/Command/System/CheckCommand.php b/src/Console/Command/System/CheckCommand.php index ff69833..ae5dace 100644 --- a/src/Console/Command/System/CheckCommand.php +++ b/src/Console/Command/System/CheckCommand.php @@ -238,7 +238,7 @@ private function getMysqlVersionViaPdo(): ?string /** * Get database configuration from environment variables * - * @return array + * @return array */ private function getDatabaseConfig(): array { @@ -500,7 +500,7 @@ private function checkSearchEngineConnections(): ?string /** * Get potential search engine hosts * - * @return array + * @return string[] */ private function getSearchEngineHosts(): array { @@ -531,7 +531,7 @@ private function getSearchEngineHosts(): array /** * Format search engine version output * - * @param array $info + * @param array $info * @return string */ private function formatSearchEngineVersion(array $info): string @@ -549,7 +549,7 @@ private function formatSearchEngineVersion(array $info): string * Test Elasticsearch connection and return version info * * @param string $url - * @return array|bool + * @return array|false */ private function testElasticsearchConnection(string $url) { @@ -573,7 +573,7 @@ private function testElasticsearchConnection(string $url) * Try to connect using Magento's HTTP client * * @param string $url - * @return array|null + * @return array|null */ private function tryMagentoHttpClient(string $url): ?array { @@ -603,7 +603,7 @@ private function tryMagentoHttpClient(string $url): ?array /** * Get important PHP extensions * - * @return array + * @return array> */ private function getImportantPhpExtensions(): array { @@ -757,8 +757,8 @@ private function getSystemEnvironmentValue(string $name): ?string { // Use ini_get for certain system variables as a safer alternative if (in_array($name, ['memory_limit', 'max_execution_time'])) { - $value = ini_get($name); - if ($value !== false) { + $value = (string)ini_get($name); + if ($value !== '') { return $value; } } diff --git a/src/Console/Command/System/VersionCommand.php b/src/Console/Command/System/VersionCommand.php index d2e5ff6..64392af 100644 --- a/src/Console/Command/System/VersionCommand.php +++ b/src/Console/Command/System/VersionCommand.php @@ -17,7 +17,6 @@ class VersionCommand extends AbstractCommand { private const API_URL = 'https://api.github.com/repos/openforgeproject/mageforge/releases/latest'; - private const PACKAGE_NAME = 'openforgeproject/mageforge'; private const UNKNOWN_VERSION = 'Unknown'; /** diff --git a/src/Console/Command/Theme/BuildCommand.php b/src/Console/Command/Theme/BuildCommand.php index 793d5ba..1d807f3 100644 --- a/src/Console/Command/Theme/BuildCommand.php +++ b/src/Console/Command/Theme/BuildCommand.php @@ -492,7 +492,7 @@ private function getServerVar(string $name): ?string private function setEnvVar(string $name, string $value): void { // Validate input parameters - if (empty($name) || !is_string($name)) { + if (empty($name) ) { return; } diff --git a/src/Console/Command/Theme/CleanCommand.php b/src/Console/Command/Theme/CleanCommand.php index 2d223aa..1ed6e0e 100644 --- a/src/Console/Command/Theme/CleanCommand.php +++ b/src/Console/Command/Theme/CleanCommand.php @@ -638,7 +638,7 @@ private function getServerVar(string $name): ?string */ private function setEnvVar(string $name, string $value): void { - if (empty($name) || !is_string($name)) { + if (empty($name) ) { return; } diff --git a/src/Console/Command/Theme/TokensCommand.php b/src/Console/Command/Theme/TokensCommand.php index 9255b9c..5b1687c 100644 --- a/src/Console/Command/Theme/TokensCommand.php +++ b/src/Console/Command/Theme/TokensCommand.php @@ -125,7 +125,7 @@ private function validateHyvaTheme(string $themeCode, OutputInterface $output): // If no theme was selected, exit if ($correctedTheme === null) { - return Cli::RETURN_FAILURE; + return null; } // Use the corrected theme code @@ -135,7 +135,7 @@ private function validateHyvaTheme(string $themeCode, OutputInterface $output): // Double-check the corrected theme exists if ($themePath === null) { $this->io->error("Theme $themeCode is not installed."); - return Cli::RETURN_FAILURE; + return null; } $this->io->info("Using theme: $themeCode"); diff --git a/src/Model/TemplateEngine/Decorator/InspectorHints.php b/src/Model/TemplateEngine/Decorator/InspectorHints.php index c74199e..6fcc980 100644 --- a/src/Model/TemplateEngine/Decorator/InspectorHints.php +++ b/src/Model/TemplateEngine/Decorator/InspectorHints.php @@ -4,7 +4,6 @@ namespace OpenForgeProject\MageForge\Model\TemplateEngine\Decorator; -use Magento\Framework\App\ObjectManager; use Magento\Framework\Math\Random; use Magento\Framework\View\Element\AbstractBlock; use Magento\Framework\View\Element\BlockInterface; @@ -17,28 +16,18 @@ */ class InspectorHints implements TemplateEngineInterface { - private TemplateEngineInterface $subject; - - private bool $showBlockHints; - - private ?Random $random = null; - private string $magentoRoot; /** * @param TemplateEngineInterface $subject * @param bool $showBlockHints - * @param Random|null $random + * @param Random $random */ public function __construct( - TemplateEngineInterface $subject, - bool $showBlockHints, - ?Random $random = null + private readonly TemplateEngineInterface $subject, + private readonly bool $showBlockHints, + private readonly Random $random ) { - $this->subject = $subject; - $this->showBlockHints = $showBlockHints; - $this->random = $random ?? ObjectManager::getInstance()->get(Random::class); - // Get Magento root directory - try multiple strategies // 1. Try from BP constant (most reliable) if (defined('BP')) { @@ -62,6 +51,10 @@ public function render(BlockInterface $block, $templateFile, array $dictionary = { $result = $this->subject->render($block, $templateFile, $dictionary); + if (!$this->showBlockHints) { + return $result; + } + // Only inject attributes if there's actual HTML content if (empty(trim($result))) { return $result; @@ -189,7 +182,7 @@ private function getParentBlockName(BlockInterface $block): string { if ($block instanceof AbstractBlock) { $parent = $block->getParentBlock(); - if ($parent && method_exists($parent, 'getNameInLayout')) { + if ($parent instanceof AbstractBlock) { return $parent->getNameInLayout() ?: ''; } } @@ -205,7 +198,7 @@ private function getParentBlockName(BlockInterface $block): string */ private function getBlockAlias(BlockInterface $block): string { - if ($block instanceof AbstractBlock && method_exists($block, 'getNameInLayout')) { + if ($block instanceof AbstractBlock) { return $block->getNameInLayout() ?: ''; } diff --git a/src/Model/TemplateEngine/Decorator/InspectorHintsFactory.php b/src/Model/TemplateEngine/Decorator/InspectorHintsFactory.php deleted file mode 100644 index 5360ad0..0000000 --- a/src/Model/TemplateEngine/Decorator/InspectorHintsFactory.php +++ /dev/null @@ -1,34 +0,0 @@ -objectManager = $objectManager; - } - - /** - * Create InspectorHints instance - * - * @param array $data - * @return InspectorHints - */ - public function create(array $data = []): InspectorHints - { - return $this->objectManager->create(InspectorHints::class, $data); - } -} diff --git a/src/Model/TemplateEngine/Plugin/InspectorHints.php b/src/Model/TemplateEngine/Plugin/InspectorHints.php index 31e74cc..751206d 100644 --- a/src/Model/TemplateEngine/Plugin/InspectorHints.php +++ b/src/Model/TemplateEngine/Plugin/InspectorHints.php @@ -22,35 +22,13 @@ class InspectorHints { private const XML_PATH_INSPECTOR_ENABLED = 'dev/mageforge_inspector/enabled'; - private ScopeConfigInterface $scopeConfig; - - private StoreManagerInterface $storeManager; - - private DevHelper $devHelper; - - private InspectorHintsFactory $inspectorHintsFactory; - - private State $state; - - /** - * @param ScopeConfigInterface $scopeConfig - * @param StoreManagerInterface $storeManager - * @param DevHelper $devHelper - * @param InspectorHintsFactory $inspectorHintsFactory - * @param State $state - */ public function __construct( - ScopeConfigInterface $scopeConfig, - StoreManagerInterface $storeManager, - DevHelper $devHelper, - InspectorHintsFactory $inspectorHintsFactory, - State $state + private readonly ScopeConfigInterface $scopeConfig, + private readonly StoreManagerInterface $storeManager, + private readonly DevHelper $devHelper, + private readonly InspectorHintsFactory $inspectorHintsFactory, + private readonly State $state ) { - $this->scopeConfig = $scopeConfig; - $this->storeManager = $storeManager; - $this->devHelper = $devHelper; - $this->inspectorHintsFactory = $inspectorHintsFactory; - $this->state = $state; } /** @@ -59,7 +37,7 @@ public function __construct( * @param TemplateEngineFactory $subject * @param TemplateEngineInterface $invocationResult * @return TemplateEngineInterface - * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * @SuppressWarnings("PHPMD.UnusedFormalParameter") */ public function afterCreate( TemplateEngineFactory $subject, diff --git a/src/Model/ThemePath.php b/src/Model/ThemePath.php index 37bff14..e4c739e 100644 --- a/src/Model/ThemePath.php +++ b/src/Model/ThemePath.php @@ -6,14 +6,11 @@ use Magento\Framework\Component\ComponentRegistrar; use Magento\Framework\Component\ComponentRegistrarInterface; -use Magento\Theme\Model\ResourceModel\Theme\Collection as ThemeCollection; class ThemePath { public function __construct( - private readonly ThemeList $themeList, - private readonly ComponentRegistrarInterface $componentRegistrar, - private readonly ThemeCollection $themeCollection + private readonly ComponentRegistrarInterface $componentRegistrar ) { } diff --git a/src/Service/Hyva/CompatibilityChecker.php b/src/Service/Hyva/CompatibilityChecker.php index 219475c..2cadd0f 100644 --- a/src/Service/Hyva/CompatibilityChecker.php +++ b/src/Service/Hyva/CompatibilityChecker.php @@ -19,8 +19,7 @@ class CompatibilityChecker { public function __construct( private readonly ComponentRegistrarInterface $componentRegistrar, - private readonly ModuleScanner $moduleScanner, - private readonly IncompatibilityDetector $incompatibilityDetector + private readonly ModuleScanner $moduleScanner ) { } diff --git a/src/Service/StaticContentCleaner.php b/src/Service/StaticContentCleaner.php index bd9cd82..311a261 100644 --- a/src/Service/StaticContentCleaner.php +++ b/src/Service/StaticContentCleaner.php @@ -61,7 +61,7 @@ public function cleanIfNeeded( $cleanedStatic = $this->themeCleaner->cleanPubStatic($themeCode, $io, false, $isVerbose); $cleanedPreprocessed = $this->themeCleaner->cleanViewPreprocessed($themeCode, $io, false, $isVerbose); - return ($cleanedStatic > 0 || $cleanedPreprocessed > 0) || !$this->themeCleaner->hasStaticFiles($themeCode); + return ($cleanedStatic > 0 || $cleanedPreprocessed > 0); } catch (\Exception $e) { $io->error('Failed to check/clean static content: ' . $e->getMessage()); return false; diff --git a/src/Service/ThemeBuilder/BuilderPool.php b/src/Service/ThemeBuilder/BuilderPool.php index 134d0cf..1633b82 100644 --- a/src/Service/ThemeBuilder/BuilderPool.php +++ b/src/Service/ThemeBuilder/BuilderPool.php @@ -6,16 +6,12 @@ class BuilderPool { - /** @var BuilderInterface[] */ - private array $builders; - /** * @param BuilderInterface[] $builders */ public function __construct( - array $builders = [] + private readonly array $builders = [] ) { - $this->builders = $builders; } public function getBuilder(string $themePath): ?BuilderInterface