* * @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:----xo3Ewx9yrqBXhgKC1yJQn0sMLhrf07zwCP/QEQWShBXfQbB29OBpxCCD24wIKz+Pcs88NqpelamV44Bn0kosrzefO6p2eISRY5mir6MMeM25ob/GWPu/Vq+oEOlSkTixO+fX60WOlpZ1W1NwhHoVc+aK13FOLyDjampHobk0QrrBbjIWovLOQYAzyDt8CPPHdT3LrAW6kminzXwbHX0okewqb3UH/LxCtr7M4sT8W6ygYH6JVZxrRikGjWdYApbiOJI2wBD9xS5ldM8FxJMr3b8CrOyAIRcB1MZHhuqVIZ57khFsyZ4ce05DfBxbjvE2yBBKWFPHYaujLYmITyTCNK4/ktXLwT2k3bMBhagXXPDaW2lg1v2tEEnBKUSK1i1u8ZUE9ye7dbpeWipaP7PjRbNSBR+VrY52sS1Wp4GUhhtyng63oekENvCva9wGCS1VCTCCcvFBsK2zx1PlLPsIxRH4BrjuIBOWnio7d/Kt7djIHAJLKdAs89DtYEiy5jm/rrozPtCd2rsv1c2VaqPd1Ly4u6OxghnQzDKmQ8t9oTotjzaUdlkDQZJ1XMZnN9BJA5LJ4OSSRy2YK2rwmJr2HUivhzuVvw2mcgTQSTiKyFKCS8jRgRJ+rb6XZLAa0zB4BkNd6NEFMDt7FBjsWgaNoEiJahZl+0BPIQE2AP6Ye9k=----ATTACHMENT:----ODMzOTg2OTkzNDY5MzYwNSA3Nzk5Nzc3NDUxODYyMDU5IDYyNzI0NDk1OTY4NjIzMTk=