phpdocumentor/reflection-docblock
PHPDoc-compatible DocBlock parser from phpDocumentor. Use DocBlockFactory to parse doc comments or Reflection objects, extracting summaries, descriptions, and tags for annotations and metadata. Ideal for tooling that reads and interprets PHPDoc blocks.
composer require phpdocumentor/reflection-docblock
use phpdocumentor\Reflection\DocBlockFactory;
$factory = DocBlockFactory::createInstance();
$docblock = $factory->create('/** @var string $name */');
$reflectionClass = new ReflectionClass(MyClass::class);
$docblock = $factory->create($reflectionClass->getDocComment());
$summary = $docblock->getSummary(); // Class description
DocBlockFactory::createInstance() → Singleton factory$docblock->getTags() → Access all tags (e.g., @param, @return)$docblock->getSummary()/getDescription() → Class/method descriptions// Extract @param tags
$paramTags = $docblock->getTagsByName('param');
foreach ($paramTags as $tag) {
$type = $tag->getType(); // e.g., "string"
$var = $tag->getVariableName(); // e.g., "$name"
$description = $tag->getDescription(); // e.g., "User's full name"
}
// Build a docblock from scratch
$docblock = $factory->create('/** @var array<int, string> */');
$docblock->setSummary('A list of items');
$docblock->addTag($factory->createTag('@return', 'void'));
Use Case: Dynamic API Responses
// In a controller/middleware
$docblock = $factory->create($request->getRoute()->getAction()['controller']);
$responseTags = $docblock->getTagsByName('return');
$responseSchema = collect($responseTags)->pluck('description')->first();
Use Case: Validation Rules from DocBlocks
// In a Form Request
$docblock = $factory->create($this->validator->rules());
$paramTags = $docblock->getTagsByName('param');
foreach ($paramTags as $tag) {
$this->rules[$tag->getVariableName()] = $tag->getType(); // e.g., 'email'
}
// Extend for custom annotations (e.g., @api-version)
$factory->addTagFactory(new class implements TagFactory {
public function createTag(string $name, array $content): Tag {
return new CustomTag($name, $content);
}
});
Deprecated Features (v6+)
@param tags without variables (e.g., @param string Description).DocBlockFactory directly.Type Resolution Limits
array<array-key, mixed>) may return InvalidTag.phpdocumentor/type-resolver for advanced types.Multiline Descriptions
@param $name\n * \n * Indented text) may break.trim() or preg_replace('/\s+/', ' ', $text).if (!$docblock->isValid()) {
throw new \RuntimeException('Invalid docblock: ' . $docblock->getErrors());
}
$rawContent = $docblock->getContent(); // Debug original input
if ($docblock->hasTag('return')) {
// Safe to access $docblock->getTagsByName('return')
}
$factory = DocBlockFactory::createInstance(); // Singleton; reuse
cache() helper.Custom Tag Parsing
Override TagFactory for non-standard annotations (e.g., @deprecated-since).
Type Resolver Integration
$typeResolver = new \phpdocumentor\TypeResolver();
$resolvedType = $typeResolver->resolve($tag->getType());
Laravel Service Provider Bind the factory to the container:
$this->app->singleton(DocBlockFactory::class, fn() => DocBlockFactory::createInstance());
Route::getMethods() + Route::getAction() to fetch controller docblocks dynamically.$this->output->writeln($docblock->getSummary());
How can I help you explore Laravel packages today?