orbiter / annotations-util
Doctrine\Annotations的辅助工具,带有缓存的Reflections ⚡
0.6.2
2022-10-20 18:24 UTC
Requires
- php: >=8.1
- doctrine/annotations: ^1.13.2
- nikic/php-parser: ^4.3.0
- scaleupstack/reflection: ^1.2
README
Doctrine\Annotations的辅助工具,使用scaleupstack/reflection进行缓存的Reflection。
包括CodeInfo,用于静态代码分析,以便更容易、自动地解析注释和例如DI的设置。
使用composer安装
composer require orbiter/annotations-util
有关注释的详细信息以及更复杂的示例,请参阅doctrine文档。
AnnotationsUtil
<?php use Orbiter\AnnotationsUtil\AnnotationUtil; use Orbiter\AnnotationsUtil\CachedReflection; // Add PSR-4 Annotation Namespaces AnnotationUtil::registerPsr4Namespace('Lib', __DIR__ . '/lib'); // uses only cached Reflection, without annotations CachedReflection::getClass(App\Foo::class): ReflectionClass; CachedReflection::getProperty(App\Foo::class, 'bar'): ReflectionProperty; CachedReflection::getMethod(App\Foo::class, 'foo'): ReflectionMethod; CachedReflection::setPropertyValue(App\Foo::class, 'bar'); CachedReflection::setStaticPropertyValue(App\Foo::class, 'bar_tastic'); CachedReflection::invokeMethod(App\Foo::class, 'fooTastic'); CachedReflection::invokeStaticMethod(App\Foo::class, 'foo'); // Use normal doctrine where needed Doctrine\Common\Annotations\AnnotationReader::addGlobalIgnoredName('dummy'); // setup reader with cached reflections $annotation_reader_cached = new Orbiter\AnnotationsUtil\AnnotationReader( new Doctrine\Common\Annotations\IndexedReader( new Doctrine\Common\Annotations\AnnotationReader() ) ); // Get Annotations $annotation_reader_cached->getClassAnnotations(App\Foo::class): array;// of annotations $annotation_reader_cached->getClassAnnotation(App\Foo::class, Lib\MyAnnotation::class): Lib\MyAnnotation; $annotation_reader_cached->getPropertyAnnotations(App\Foo::class, 'bar'): array;// of annotations $annotation_reader_cached->getPropertyAnnotation(App\Foo::class, 'bar', Lib\MyAnnotation::class): Lib\MyAnnotation; echo $annotation_reader_cached->getPropertyAnnotation(App\Foo::class, 'bar', Lib\MyAnnotation::class)->myProperty; $annotation_reader_cached->getMethodAnnotations(App\Foo::class, 'foo'): array;// of annotations $annotation_reader_cached->getMethodAnnotation(App\Foo::class, 'foo', Lib\MyAnnotation::class): Lib\MyAnnotation; echo $annotation_reader_cached->getMethodAnnotation(App\Foo::class, 'foo', Lib\MyAnnotation::class)->myProperty; // Setup code inspection / class discovery: $code_info = new Orbiter\AnnotationsUtil\CodeInfo(); if(getenv('env') === 'prod') { // absolute file to cache, if cache exists, it will not be re-freshed. // Delete the file for a new cache $code_info->enableFileCache(__DIR__ . '/tmp/codeinfo.cache'); } // Add a dirs to scan, use `flag` for grouping different folders in the result $code_info->defineSource( new CodeInfoSource( __DIR__ . '/app', ['FLAG_APP'], ['php'], ), ); // parse defined folders $code_info->process(); // Get the discovery for annotations: $discovery = new Orbiter\AnnotationsUtil\AnnotationDiscovery($annotation_reader_cached); $discovery->discoverByAnnotation( $code_info->getClassNames('FLAG_APP'), ); $results = $discovery->getDiscovered(Satellite\KernelRoute\Annotations\Route::class); foreach($results as $result) { $result->getAnnotation(); }
示例注释
定义您的注释,请记住在Annotation加载器中指定它 - 使用@Annotation的类不支持正常自动加载!
<?php namespace Lib; use Doctrine\Common\Annotations\Annotation; /** * @Annotation */ final class MyAnnotation { public $myProperty; }
在类中使用注释
<?php namespace App; use Lib\MyAnnotation; class Foo { /** * @MyAnnotation(myProperty="demo-value") */ private $bar; }
获取注释的值
<?php // this prints "demo-value" echo $annotation_reader_cached->getMethodAnnotation(App\Foo::class, 'bar', Lib\MyAnnotation::class)->myProperty; /** * @var Lib\MyAnnotation $annotation this variable is the Annotation instance and contains also it's data */ $annotation = $annotation_reader_cached->getMethodAnnotation(App\Foo::class, 'bar', Lib\MyAnnotation::class); // this is the recommended way to use the properties echo $annotation->myProperty;
这是一个简化的版本,使用此工具读取,从Doctrine\Annotations: Create Annotations中。
查看示例
想使用依赖注入和注释构建控制台应用程序?使用此应用程序骨架:elbakerino/console,由PHP-DI提供支持,使用Doctrine\Annotations以及此包。
使用Satellite构建基于事件和中间件的应用程序,DI启用,并具有用于CLI命令和路由的注释。
许可证
本项目是免费软件,根据MIT许可证分发。
查看:LICENSE。
贡献者
通过将您的代码提交到代码库,您同意在代码库附带的MIT许可证下发布代码,而不期望任何考虑。