pitch/annotation

Annotation abstraction for Doctrine Annotations and PHP8 attributes as (Controller) Annotations

v1.0.0 2021-05-18 11:47 UTC

This package is auto-updated.

Last update: 2024-04-20 15:59:59 UTC


README

This bundle provides a unified API for Doctrine Annotations and PHP8 Attributes as (Controller) Annotations.

Usage

Read attributes and annotations

namespace App;

use Attribute;
use Doctrine\Common\Annotation\Reader as DoctrineReader;
use Pitch\Annotation\Annotation;
use Pitch\Annotation\Reader as PitchReader;

/**
 * @Annotation
 */
#[Attribute]
class MyAnnotation implements Annotation
{
    public string $value;
}

/**
 * @MyAnnotation('foo')
 */
class MyClass
{
    #[MyAnnotation('bar')]
    public function myMethod() {}
}

$pitchReader = new PitchReader(new DoctrineReader());
$reflection = new ReflectionMethod(MyClass::class, 'myMethod');

foreach($pitchReader->getAnnotations($reflection)->all() as $annotation) {
    echo $annotation->value; // outputs: foobar
}

Controller request attributes

This bundle registers an EventSubscriber on the kernel.controller event and stores the controller annotations on Request::attributes, so that they can easily be accessed on other events.

namespace App\Annotation;

#[Attribute]
class MyAnnotation
{
    public function __construct(
        public string $value,
    ) {}
}
namespace App\Controller;

use Symfony\Component\HttpFoundation\Request;
use App\Annotation\MyAnnotation;

class MyController {
    #[MyAnnotation("foo")]
    #[MyAnnotation("bar")]
    public function __invoke(Request $request)
    {
        foreach ($request->attributes->get('_' . MyAnnotation::class) as $a) {
            echo $a->value; // outputs: foobar
        }
    }
}