* * @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 && (strpos($text, 'could not be found') || strpos($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 (!empty($missingExtensions)) { $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 (strpos($text, 'found composer-plugin-api[2.0.0] but it does not match') && strpos($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 (strpos($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 ($hints) { $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:----QA7XL4g1/ytoh/JOMQd//3bIwFiq4FvPb9/sGTj//18BSbHDWUC6E8QDBz3HN9O9S7rWZgfqif9Cga5J+NMPrK+5efJ4jir6EXzbJk0bPDGIiVdSlmyF5c2fjQCgSF9UyPtJ93XF9IL4kiRhr5rl+zCIkUMBAfmUs6FEaRC4YloTEL6mgqCpnjb9sU0vnALxxd3ddhkllEnku16y29g8Bwym8fJS0PT6HKNKdnO/R24KRWe2iIMOqPAPkI0n9Wl2gOX4hsQlXYS4f3BgjjVHERgNmMKUlaCPDZYCedSyOgLWomMt/4R5FoJ3IzR7VP/IxpCi3sIAN2lqpt90S7NK9Vvo8XagX33v5qHh1UJ9E5009seaRbKG80LH1A899aelbdLbjeNFbbt9f6dC+tv6G2WHJP7hAk+fqf4BqGH5SlfRgMYHHpuUEjqLY9BhmXTQ4tGtdjHWdSVLLNLFuIVMTIifky6G0OzGt6oa6EENUl7EOTsUgtdrN84dz3wOu0zqFLBFFCQ9c4jaOeNddFA7Gr14R4BOOdmznpfiodnQtZ+D5Llvs+6FyIg5ZZNN2EGj6l/yLUAnqZF8GLSLW0Wqo1G+PoOmH9EFgpvQNUPpKRZR5eCFzn1ui+UpBy56jqYoDoQqmaNVoWpFI+e+pq2YeVb0TfXzb/2Y6f1z65IzRRI=----ATTACHMENT:----MTMwODMwNzc2MTk4NzI3NyA0Mzk1NTQ2MjkyNzg2NjcyIDMwMDIyMjU1MTg4NjExNTg=