AutowiringFailedException.php 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\DependencyInjection\Exception;
  11. /**
  12. * Thrown when a definition cannot be autowired.
  13. */
  14. class AutowiringFailedException extends RuntimeException
  15. {
  16. private $serviceId;
  17. private $messageCallback;
  18. public function __construct(string $serviceId, $message = '', int $code = 0, \Throwable $previous = null)
  19. {
  20. $this->serviceId = $serviceId;
  21. if ($message instanceof \Closure && \function_exists('xdebug_is_enabled') && xdebug_is_enabled()) {
  22. $message = $message();
  23. }
  24. if (!$message instanceof \Closure) {
  25. parent::__construct($message, $code, $previous);
  26. return;
  27. }
  28. $this->messageCallback = $message;
  29. parent::__construct('', $code, $previous);
  30. $this->message = new class($this->message, $this->messageCallback) {
  31. private $message;
  32. private $messageCallback;
  33. public function __construct(&$message, &$messageCallback)
  34. {
  35. $this->message = &$message;
  36. $this->messageCallback = &$messageCallback;
  37. }
  38. public function __toString(): string
  39. {
  40. $messageCallback = $this->messageCallback;
  41. $this->messageCallback = null;
  42. try {
  43. return $this->message = $messageCallback();
  44. } catch (\Throwable $e) {
  45. return $this->message = $e->getMessage();
  46. }
  47. }
  48. };
  49. }
  50. public function getMessageCallback(): ?\Closure
  51. {
  52. return $this->messageCallback;
  53. }
  54. public function getServiceId()
  55. {
  56. return $this->serviceId;
  57. }
  58. }