注解解析器
最后更新于:2022-04-02 05:15:09
[TOC]
# 注解解析器
这是第一次用C语言为PHP世界编写注解解析器组件。`Phalcon\Annotations`是一个通用组件,可以在PHP类中轻松解析和缓存注解,以便在应用程序中使用。
从类,方法和属性中的docblock读取注解。注解可以放在docblock中的任何位置:
```php
'annotations',
'lifetime' => '3600',
'adapter' => 'memory', // Load the Memory adapter
];
$annotations = Factory::load($options);
```
在处理从配置文件中实例化注解适配器时,Factory加载程序提供了更大的灵活性。
## 阅读注解
实现反射器以使用面向对象的接口轻松获取在类上定义的注解:
```php
get('Example');
// Read the annotations in the class' docblock
$annotations = $reflector->getClassAnnotations();
// Traverse the annotations
foreach ($annotations as $annotation) {
// Print the annotation name
echo $annotation->getName(), PHP_EOL;
// Print the number of arguments
echo $annotation->numberArguments(), PHP_EOL;
// Print the arguments
print_r($annotation->getArguments());
}
```
注解读取过程非常快,但出于性能原因,建议使用适配器存储解析的注解。适配器缓存已处理的注解,无需一次又一次地解析注解。
在上面的示例中使用了`Phalcon\Annotations\Adapter\Memory` 。此适配器仅在请求运行时缓存注解,因此适配器更适合开发。当应用程序处于生产阶段时,还有其他适配器可以换出。
## 注解的类型
注解可能有参数或没有。参数可以是简单的文字(字符串,数字,布尔值,空),数组,散列列表或其他注解:
```php
attach(
'dispatch',
new CacheEnablerPlugin()
);
$dispatcher = new MvcDispatcher();
$dispatcher->setEventsManager($eventsManager);
return $dispatcher;
};
```
`CacheEnablerPlugin` 是一个插件,它拦截调度程序中执行的每个操作,如果需要,启用缓存:
```php
annotations->getMethod(
$dispatcher->getControllerClass(),
$dispatcher->getActiveMethod()
);
// Check if the method has an annotation 'Cache'
if ($annotations->has('Cache')) {
// The method has the annotation 'Cache'
$annotation = $annotations->get('Cache');
// Get the lifetime
$lifetime = $annotation->getNamedParameter('lifetime');
$options = [
'lifetime' => $lifetime,
];
// Check if there is a user defined cache key
if ($annotation->hasNamedParameter('key')) {
$options['key'] = $annotation->getNamedParameter('key');
}
// Enable the cache for the current method
$this->view->cache($options);
}
}
}
```
现在,我们可以在控制器中使用注解:
```php
view->article = Articles::find();
}
/**
* This is a comment
*
* @Cache(key='my-key', lifetime=86400)
*/
public function showAction($slug)
{
$this->view->article = Articles::findFirstByTitle($slug);
}
}
```
### 带注解的私人/公共区域
您可以使用注解告诉ACL哪些控制器属于管理区域:
```php
getControllerClass();
// Possible method name
$actionName = $dispatcher->getActiveMethod();
// Get annotations in the controller class
$annotations = $this->annotations->get($controllerName);
// The controller is private?
if ($annotations->getClassAnnotations()->has('Private')) {
// Check if the session variable is active?
if (!$this->session->get('auth')) {
// The user is no logged redirect to login
$dispatcher->forward(
[
'controller' => 'session',
'action' => 'login',
]
);
return false;
}
}
// Continue normally
return true;
}
}
```
## 注解适配器
该组件使用适配器来缓存或不缓存已解析和处理的注解,从而提高性能或为开发/测试提供便利:
| 类 | 描述 |
| --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Phalcon\Annotations\Adapter\Memory` | 注解仅缓存在内存中。当请求结束时,清除缓存,重新加载每个请求中的注解。此适配器适用于开发阶段 |
| `Phalcon\Annotations\Adapter\Files` | 经过解析和处理的注解将永久存储在PHP文件中,从而提高性能。此适配器必须与字节码缓存一起使用。 |
| `Phalcon\Annotations\Adapter\Apc` | 经过解析和处理的注解会永久存储在APC高速缓存中,从而提高性能。这是更快的适配器 |
| `Phalcon\Annotations\Adapter\Xcache` | 经过解析和处理的注解会永久存储在XCache缓存中,从而提高性能。这也是一个快速适配器 |
### 实现自己的适配器
必须实现`Phalcon\Annotations\AdapterInterface`接口才能创建自己的注解适配器或扩展现有注解适配器。
## 外部资源
* [教程:使用Annotations创建自定义模型的初始化程序](https://blog.phalconphp.com/post/tutorial-creating-a-custom-models-initializer)
';