vendor/api-platform/core/src/Core/Metadata/Resource/Factory/PhpDocResourceMetadataFactory.php line 32

Open in your IDE?
  1. <?php
  2. /*
  3. * This file is part of the API Platform project.
  4. *
  5. * (c) Kévin Dunglas <dunglas@gmail.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. declare(strict_types=1);
  11. namespace ApiPlatform\Core\Metadata\Resource\Factory;
  12. use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
  13. use phpDocumentor\Reflection\DocBlockFactory;
  14. use phpDocumentor\Reflection\DocBlockFactoryInterface;
  15. use phpDocumentor\Reflection\Types\ContextFactory;
  16. /**
  17. * Extracts descriptions from PHPDoc.
  18. *
  19. * @author Kévin Dunglas <dunglas@gmail.com>
  20. */
  21. final class PhpDocResourceMetadataFactory implements ResourceMetadataFactoryInterface
  22. {
  23. private $decorated;
  24. private $docBlockFactory;
  25. private $contextFactory;
  26. public function __construct(ResourceMetadataFactoryInterface $decorated, DocBlockFactoryInterface $docBlockFactory = null)
  27. {
  28. $this->decorated = $decorated;
  29. $this->docBlockFactory = $docBlockFactory ?: DocBlockFactory::createInstance();
  30. $this->contextFactory = new ContextFactory();
  31. }
  32. /**
  33. * {@inheritdoc}
  34. */
  35. public function create(string $resourceClass): ResourceMetadata
  36. {
  37. $resourceMetadata = $this->decorated->create($resourceClass);
  38. if (null !== $resourceMetadata->getDescription()) {
  39. return $resourceMetadata;
  40. }
  41. $reflectionClass = new \ReflectionClass($resourceClass);
  42. try {
  43. $docBlock = $this->docBlockFactory->create($reflectionClass, $this->contextFactory->createFromReflector($reflectionClass));
  44. $resourceMetadata = $resourceMetadata->withDescription($docBlock->getSummary());
  45. } catch (\InvalidArgumentException $e) {
  46. // Ignore empty DocBlocks
  47. }
  48. return $resourceMetadata;
  49. }
  50. }