编写自定义注解
优质
小牛编辑
137浏览
2023-12-01
在 imi 框架中,使用注解可以实现很多功能。比如:路由、模型定义、事务、缓存等等
除了内置的注解以外,如果编写属于自己的注解呢?
这篇教程就来教大家来编写属于自己的注解。
注解定义
注解扫描
imi 是常驻内存运行的,所以冷启动时采用了全量扫描的方式,来实现注解缓存。使用的时候,就和读取配置一样简单高效。
一般需要在配置文件里的beanScan
中,配置注解类所在命名空间。在 imi 框架中,涉及注解的,都需要配置。
注解类
每个注解都是一个类。
注解类需要继承\Imi\Bean\Annotation\Base
类
<?php
namespace ImiApp\Annotation;
use Imi\Bean\Annotation\Base;
use Imi\Bean\Annotation\Parser;
/**
* 示例注解
* @Annotation
* @Target("METHOD")
* @Parser("\Imi\Bean\Parser\NullParser")
*/
class MyAnnotation extends Base
{
/**
* 只传一个参数时的参数名
* @var string
*/
protected $defaultFieldName = 'name';
/**
* 随便定义的属性
* @var string
*/
public $name;
/**
* 随便定义的属性
* @var int
*/
public $age;
}
defaultFieldName
定义的参数名,在你使用注解时候,如果只传这一个参数,可以省略参数名
写在类上的:
@Annotation
注解,表示当前类是注解类。
@Target
注解,表示当前注解可以写在什么上面。可选:CLASS
、METHOD
、PROPERTY
、CONST
。支持传多个的写法:@Target({"CLASS", "METHOD", "PROPERTY", "CONST"})
@Parser
注解,指定扫描注解时候的处理器,一般用不着,填写"\Imi\Bean\Parser\NullParser"
即可
注解使用
由于注解是一个类,所以使用注解需要use
它
<?php
namespace ImiApp\Test;
use ImiApp\Annotation\MyAnnotation;
class Test
{
/**
* @MyAnnotation("a")
* @MyAnnotation(name="b", age=11)
*/
public function aaa()
{
}
}
注入注解
imi 中可以注入带有注解的方法。
编写 AOP 类:(不要忘记加入beanScan
哦!)
namespace ImiApp\Aop;
use Imi\Aop\Annotation\Aspect;
use Imi\Aop\Annotation\PointCut;
use Imi\Aop\PointCutType;
use Imi\Aop\AroundJoinPoint;
/**
* @Aspect
*/
class TransactionAop
{
/**
* 自动事务支持
* @PointCut(
* type=PointCutType::ANNOTATION,
* allow={
* \ImiApp\Annotation\MyAnnotation::class
* }
* )
* @Around
* @return mixed
*/
public function parseTransaction(AroundJoinPoint $joinPoint)
{
// 前置操作
// 执行原方法,获取返回值
$result = $joinPoint->proceed($args);
// 后置操作
// 返回返回值,如有必要你也可以自己决定其他返回值
return $result;
}
}
具体用法请参考:https://doc.imiphp.com/components/aop/index.html
获取注解
具体用法请参考:https://doc.imiphp.com/annotations/annotationManager.html