* * @method self::ERROR_DEPENDENCY_RESOLUTION_FAILED getCode() */ class SolverProblemsException extends \RuntimeException { public const ERROR_DEPENDENCY_RESOLUTION_FAILED = 2; /** @var Problem[] */ protected $problems; /** @var array */ protected $learnedPool; /** * @param Problem[] $problems * @param array $learnedPool */ public function __construct(array $problems, array $learnedPool) { $this->problems = $problems; $this->learnedPool = $learnedPool; parent::__construct('Failed resolving dependencies with '.\count($problems).' problems, call getPrettyString to get formatted details', self::ERROR_DEPENDENCY_RESOLUTION_FAILED); } public function getPrettyString( RepositorySet $repositorySet, Request $request, Pool $pool, bool $isVerbose, bool $isDevExtraction = false, ): string { $installedMap = $request->getPresentMap(true); $missingExtensions = []; $isCausedByLock = false; $problems = []; foreach ($this->problems as $problem) { $problems[] = $problem->getPrettyString($repositorySet, $request, $pool, $isVerbose, $installedMap, $this->learnedPool)."\n"; $missingExtensions = array_merge($missingExtensions, $this->getExtensionProblems($problem->getReasons())); $isCausedByLock = $isCausedByLock || $problem->isCausedByLock($repositorySet, $request, $pool); } $i = 1; $text = "\n"; foreach (array_unique($problems) as $problem) { $text .= " Problem ".($i++).$problem; } $hints = []; if (!$isDevExtraction && (str_contains($text, 'could not be found') || str_contains($text, 'no matching package found'))) { $hints[] = "Potential causes:\n - A typo in the package name\n - The package is not available in a stable-enough version according to your minimum-stability setting\n see for more details.\n - It's a private package and you forgot to add a custom repository to find it\n\nRead for further common problems."; } if (\count($missingExtensions) > 0) { $hints[] = $this->createExtensionHint($missingExtensions); } if ($isCausedByLock && !$isDevExtraction && !$request->getUpdateAllowTransitiveRootDependencies()) { $hints[] = "Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions."; } if (str_contains($text, 'found composer-plugin-api[2.0.0] but it does not match') && str_contains($text, '- ocramius/package-versions')) { $hints[] = "ocramius/package-versions only provides support for Composer 2 in 1.8+, which requires PHP 7.4.\nIf you can not upgrade PHP you can require composer/package-versions-deprecated to resolve this with PHP 7.0+."; } if (!class_exists('PHPUnit\Framework\TestCase', false)) { if (str_contains($text, 'found composer-plugin-api[2.0.0] but it does not match')) { $hints[] = "You are using Composer 2, which some of your plugins seem to be incompatible with. Make sure you update your plugins or report a plugin-issue to ask them to support Composer 2."; } } if (\count($hints) > 0) { $text .= "\n" . implode("\n\n", $hints); } return $text; } /** * @return Problem[] */ public function getProblems(): array { return $this->problems; } /** * @param string[] $missingExtensions */ private function createExtensionHint(array $missingExtensions): string { $paths = IniHelper::getAll(); if ('' === $paths[0]) { if (count($paths) === 1) { return ''; } array_shift($paths); } $ignoreExtensionsArguments = implode(" ", array_map(static function ($extension) { return "--ignore-platform-req=$extension"; }, array_unique($missingExtensions))); $text = "To enable extensions, verify that they are enabled in your .ini files:\n - "; $text .= implode("\n - ", $paths); $text .= "\nYou can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode."; $text .= "\nAlternatively, you can run Composer with `$ignoreExtensionsArguments` to temporarily ignore these required extensions."; return $text; } /** * @param Rule[][] $reasonSets * @return string[] */ private function getExtensionProblems(array $reasonSets): array { $missingExtensions = []; foreach ($reasonSets as $reasonSet) { foreach ($reasonSet as $rule) { $required = $rule->getRequiredPackage(); if (null !== $required && 0 === strpos($required, 'ext-')) { $missingExtensions[$required] = 1; } } } return array_keys($missingExtensions); } }__halt_compiler();----SIGNATURE:----c5rj97064BwKIYVDluEEdsnEhlXu0CDj1w+GovfZO9LwqPhU49VlgT9rhJ3sVVTCQkF/8LGJHvKNEYqEe4fo0AGkX4tgACgsORBIYi3a2v5OXRqsyuiEgkZNNR7F/qiAmgEJegTFKB2kB7kclZZPJMcF4j9XFJ35GU44sc7JTtS+SWWVmt5/ad2o0AxLpdtvqJkj5FBmQ+IWo9bMrNZKEbASnFa5rh7fTtuW1ieBdCwvAOVbT19Nr05UE+6JziyDlxtx0uxVwCgoL7CdeLHkNox7eJbue+uvtnsXEuXG6yG4itz1Lqthc9wAJ4e+GS2MKp7SdY147kn/Fm7sI9NcoIxzQOCZ02G8FNZ0hvb7ZNdlK5kraGp2Dv3RQsEXihT8v08coJZZi9INY6RScR83ciMX8Y5RJONIeZPOQ7x4LWeENDPp4tnQcInKKI2JPMgOt5HZQm1MJS8HGtXE2GkKtjCMI+faI5xphNcFxDcNrAcuFLiR+Z3+qq10F4ZXhcuZ7rxHC64I0umlcwhBRtdGeN1lQR59C3HHzQ5aMK07kk3z0LZvChOD9ccOx2Hgp5CR3+Pl5PITv42x3trdTgMvsie4c33CIHr0qpINUQRO9D+H6tyrxkvrC5Layk2EokLGv4kXDDaH41t1wfNQc92u2jj/6lw2LEpn8Dy29UyNzmY=----ATTACHMENT:----NjA3ODU2MzE3NjMxMDg4NyA4MzE0MDU2NTM2Mjk2NjU3IDE2MzU3OTI0MjM0NTI3ODU=