kcs / metadata
Class/Attribute metadata management component
Fund package maintenance!
alekitto
Installs: 28 439
Dependents: 4
Suggesters: 0
Security: 0
Stars: 2
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: ^8.0
- thecodingmachine/safe: ^1.0 | ^2.0
Requires (Dev)
- doctrine/annotations: ^1.2 | ^2.0
- doctrine/cache: ^1.4
- kcs/class-finder: ^0.2 | ^0.3 | ^1.0@dev
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: ^9.0
- psr/event-dispatcher: ^1.0
- roave/security-advisories: dev-master
- solido/php-coding-standards: dev-master
- symfony/cache: ^4.4|^5.0|^6.0
- symfony/finder: ^4.4|^5.0|^6.0
Suggests
- symfony/cache: cache metadata
- symfony/event-dispatcher: dispatch metadata load event
- symfony/finder: support for metadata file locators
README
Overview
This library provides utilities for metadata loading, management and retrieval for PHP classes, methods and properties.
Installation
Install with composer
$ composer require kcs/metadata
Usage
A metadata factory responsible for retrieving metadatas for a given class.
To create a metadata factory you can implement MetadataFactoryInterface
on your own class or extend the AbstractMetadataFactory
.
use Kcs\Metadata\ClassMetadataInterface; use Kcs\Metadata\Factory\MetadataFactoryInterface; class Factory implements MetadataFactoryInterface { public function getMetadataFor($class): ClassMetadataInterface { ... } }
use Kcs\Metadata\ClassMetadataInterface; use Kcs\Metadata\Factory\AbstractMetadataFactory; class Factory extends AbstractMetadataFactory { protected function createMetadata(\ReflectionClass $class): ClassMetadataInterface { return new MyClassMetadata($class); } }
This allows you to specify which implementation of ClassMetadataInterface
will be used for your metadata simply extending the createMetadata
method.
If you extend the AbstractMetadataFactory
class (or use MetadataFactory
class
which creates a ClassMetadata
instance for class metadatas), you have to create
your metadata loader class implementing LoaderInterface
.
use Kcs\Metadata\Loader\LoaderInterface; class Loader implements LoaderInterface { public function loadClassMetadata(ClassMetadataInterface $classMetadata) { ... } }
If more than one source is available for your metadata (Annotations, YAMLs, XMLs,
etc.) you can use the ChainLoader
class, adding your loaders to it.
Validation
When a metadata is loaded the factory validate
method is called with the newly loaded
metadata as argument and the Kcs\Metadata\Event\ClassMetadataLoadedEvent
event is dispatched
(if an event dispatcher is present).
You can extend validate
or listen for the metadata loaded event and check
for metadata validity. If a validation error occurs you have to throw an
InvalidMetadataException
.
Metadata classes
You can extend the provided classes ClassMetadata
, MethodMetadata
and PropertyMetadata
to build your metadata information.
By default, all the public properties are serialized in cache (if cache is
present). You can customize this behaviour by extending the __sleep
method
of the metadata classes, returning an array of serialized properties.
License
This library is released under the MIT license
Contributions
Contributions are always welcome. Feel free to open an issue or submit a PR to improve this library.