Convert Figma logo to code with AI

doctrine logoannotations

Annotations Docblock Parser

6,736
235
6,736
26

Top Related Projects

Metadata is a library for metadata management in PHP

Extracts information about PHP class' properties using metadata of popular sources

Provides tools to validate values

Extensions to the PHP Reflection API, static code scanning, and code generation

A PHP parser written in PHP

Quick Overview

Doctrine Annotations is a powerful PHP library that provides an API for parsing and handling annotations in PHP source code. It allows developers to add metadata to classes, methods, and properties using a simple syntax, which can then be used for various purposes such as configuration, validation, or documentation.

Pros

  • Easy to use and integrate into existing PHP projects
  • Provides a flexible way to add metadata to PHP code without modifying the core logic
  • Supports both native PHP 8 attributes and traditional docblock annotations
  • Well-documented and maintained by the Doctrine community

Cons

  • Can introduce a slight performance overhead due to runtime parsing of annotations
  • Requires additional setup and configuration compared to using native PHP features
  • May lead to less readable code if overused or poorly implemented
  • Dependency on external library for annotation functionality

Code Examples

  1. Defining a simple annotation:
use Doctrine\Common\Annotations\Annotation;

/**
 * @Annotation
 */
class Route
{
    public $path;
}
  1. Using the annotation in a class:
use Doctrine\Common\Annotations\AnnotationReader;

/**
 * @Route(path="/home")
 */
class HomeController
{
    // Controller logic
}

$reader = new AnnotationReader();
$reflClass = new ReflectionClass(HomeController::class);
$classAnnotations = $reader->getClassAnnotations($reflClass);

foreach ($classAnnotations as $annotation) {
    if ($annotation instanceof Route) {
        echo "Route path: " . $annotation->path;
    }
}
  1. Using PHP 8 attributes with Doctrine Annotations:
use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor;

#[Annotation]
#[NamedArgumentConstructor]
class Entity
{
    public function __construct(
        public string $name
    ) {}
}

#[Entity(name: "User")]
class User
{
    // User entity logic
}

Getting Started

To start using Doctrine Annotations in your PHP project:

  1. Install the library using Composer:

    composer require doctrine/annotations
    
  2. Set up the annotation reader in your application:

    use Doctrine\Common\Annotations\AnnotationReader;
    use Doctrine\Common\Annotations\AnnotationRegistry;
    
    AnnotationRegistry::registerLoader('class_exists');
    $reader = new AnnotationReader();
    
  3. Now you can use the $reader to parse annotations in your PHP classes, methods, and properties.

Competitor Comparisons

Metadata is a library for metadata management in PHP

Pros of Metadata

  • More flexible and extensible metadata system
  • Supports multiple drivers (annotations, YAML, XML, PHP)
  • Better performance due to caching mechanisms

Cons of Metadata

  • Less widely adopted compared to Annotations
  • Steeper learning curve for developers familiar with Annotations
  • Requires additional configuration for different drivers

Code Comparison

Annotations:

use Doctrine\Common\Annotations\Annotation;

/**
 * @Annotation
 */
class Entity
{
    // ...
}

Metadata:

use Metadata\Driver\DriverInterface;

class EntityMetadataDriver implements DriverInterface
{
    public function loadMetadataForClass(\ReflectionClass $class)
    {
        // ...
    }
}

Summary

Metadata offers a more flexible and performant approach to handling metadata in PHP applications, supporting multiple drivers and providing better caching mechanisms. However, it has a steeper learning curve and is less widely adopted compared to Annotations. Annotations, being more established, has broader community support and simpler implementation for basic use cases. The choice between the two depends on project requirements, performance needs, and developer familiarity.

Extracts information about PHP class' properties using metadata of popular sources

Pros of Property-info

  • Provides a more comprehensive set of property information, including type, description, and access details
  • Integrates seamlessly with other Symfony components, offering better compatibility within the Symfony ecosystem
  • Supports extracting property information from various sources, including PHP docblocks, TypeScript definitions, and serializer metadata

Cons of Property-info

  • May have a steeper learning curve for developers not familiar with Symfony components
  • Potentially heavier and more complex than Annotations for simpler use cases
  • Might require additional configuration and setup compared to Annotations

Code Comparison

Annotations:

use Doctrine\Common\Annotations\Annotation;

/**
 * @Annotation
 */
class MyAnnotation
{
    public $value;
}

Property-info:

use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;

$reflectionExtractor = new ReflectionExtractor();
$properties = $reflectionExtractor->getProperties(MyClass::class);
$types = $reflectionExtractor->getTypes(MyClass::class, 'propertyName');

Provides tools to validate values

Pros of symfony/validator

  • More comprehensive validation framework with built-in constraints
  • Tighter integration with Symfony ecosystem and components
  • Supports multiple validation methods (annotations, YAML, XML, PHP)

Cons of symfony/validator

  • Steeper learning curve due to more complex architecture
  • Potentially heavier performance impact for simple validation tasks
  • Requires more setup and configuration for standalone usage

Code Comparison

annotations:

use Doctrine\Common\Annotations\Annotation;

/**
 * @Annotation
 */
class NotBlank {}

/**
 * @NotBlank
 */
public $name;

symfony/validator:

use Symfony\Component\Validator\Constraints as Assert;

/**
 * @Assert\NotBlank
 */
public $name;

// Or using PHP 8 attributes
#[Assert\NotBlank]
public $name;

Both libraries support annotation-based validation, but symfony/validator offers a more extensive set of built-in constraints and validation methods. While annotations is lightweight and focused on annotation parsing, symfony/validator provides a complete validation framework with additional features and integration options within the Symfony ecosystem.

The choice between the two depends on project requirements, existing infrastructure, and the level of validation complexity needed. For simple annotation parsing, annotations might be sufficient, while symfony/validator is better suited for more complex validation scenarios and Symfony-based projects.

Extensions to the PHP Reflection API, static code scanning, and code generation

Pros of laminas-code

  • More comprehensive code generation and reflection capabilities
  • Part of a larger ecosystem (Laminas Project) with consistent coding standards
  • Actively maintained with regular updates

Cons of laminas-code

  • Steeper learning curve due to broader feature set
  • Potentially heavier footprint for simpler use cases
  • Less focused on annotation parsing compared to annotations

Code Comparison

annotations:

/**
 * @Route("/blog/{slug}", name="blog_show")
 */
public function show($slug)
{
    // ...
}

laminas-code:

use Laminas\Code\Generator\ClassGenerator;

$class = new ClassGenerator();
$class->setName('MyClass')
      ->addMethod('myMethod');

The code examples highlight the different focus areas of the two libraries. annotations is primarily used for parsing and working with annotations, while laminas-code offers more general-purpose code generation and reflection capabilities.

laminas-code provides a broader set of tools for working with PHP code, including generation, reflection, and analysis. It's part of the larger Laminas ecosystem, which can be beneficial for projects already using other Laminas components.

annotations, on the other hand, is more specialized and focused on working with annotations in PHP code. It's lighter weight and may be easier to integrate for projects that only need annotation functionality.

A PHP parser written in PHP

Pros of PHP-Parser

  • More comprehensive parsing capabilities, allowing for full PHP code analysis and manipulation
  • Actively maintained with regular updates and improvements
  • Supports parsing of newer PHP language features

Cons of PHP-Parser

  • Steeper learning curve due to its more complex API
  • Heavier resource usage for simple annotation parsing tasks
  • Requires more setup and configuration for basic use cases

Code Comparison

PHP-Parser:

use PhpParser\ParserFactory;

$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
$ast = $parser->parse('<?php echo "Hello World!";');

Annotations:

use Doctrine\Common\Annotations\AnnotationReader;

$reader = new AnnotationReader();
$annotations = $reader->getClassAnnotations(new ReflectionClass(MyClass::class));

Summary

PHP-Parser offers more powerful parsing capabilities but comes with increased complexity. Annotations is simpler and more focused on annotation handling. Choose based on your specific needs: full code analysis (PHP-Parser) or annotation processing (Annotations).

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

⚠️ PHP 8 introduced attributes, which are a native replacement for annotations. As such, this library is considered feature complete, and should receive exclusively bugfixes and security fixes.

We do not recommend using this library in new projects and encourage authors of downstream libraries to offer support for attributes as an alternative to Doctrine Annotations.

Have a look at our blog to learn more.

Doctrine Annotations

Build Status Dependency Status Reference Status Total Downloads Latest Stable Version

Docblock Annotations Parser library (extracted from Doctrine Common).

Documentation

See the doctrine-project website.

Contributing

When making a pull request, make sure your changes follow the Coding Standard Guidelines.