注解解析器

最后更新于: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)
';