注释解析器(Annotations Parser) ================================ 这是第一个为PHP用C语言写的注释解析器。 :code:`Phalcon\Annotations` 是一个通用组件,为应用中的PHP类提供易于解析和缓存注释的功能。 注释内容是读自类,方法和属性的注释区域。一个注释单元可以放在注释区域的任何位置。 .. code-block:: php get('Example'); // 读取类中注释块中的注释 $annotations = $reflector->getClassAnnotations(); // 遍历注释 foreach ($annotations as $annotation) { // 打印注释名称 echo $annotation->getName(), PHP_EOL; // 打印注释参数个数 echo $annotation->numberArguments(), PHP_EOL; // 打印注释参数 print_r($annotation->getArguments()); } 虽然这个注释的读取过程是非常快速的,然而,出于性能原因,我们建议使用一个适配器储存解析后的注释内容。 适配器把处理后的注释内容缓存起来,避免每次读取都需要解析一遍注释。 :doc:`Phalcon\\Annotations\\Adapter\\Memory <../api/Phalcon_Annotations_Adapter_Memory>` 被用在上面的例子中。这个适配器只在请求过程中缓存注释(译者注:请求完成后缓存将被清空),因为这个原因,这个适配器非常适合用于开发环境中。当应用跑在生产环境中还有其他适配器可以替换。 注释类型(Types of Annotations) -------------------------------- 注释单元可以有参数也可以没有。参数可以为简单的文字(strings, number, boolean, null),数组,哈希列表或者其他注释单元: .. code-block:: php attach('dispatch', new CacheEnablerPlugin()); $dispatcher = new MvcDispatcher(); $dispatcher->setEventsManager($eventsManager); return $dispatcher; }; CacheEnablerPlugin 这个插件拦截每一个被dispatcher执行的action,检查如果需要则启动缓存: .. code-block:: php annotations->getMethod( $dispatcher->getControllerClass(), $dispatcher->getActiveMethod() ); // 检查是否方法中带有注释名称‘Cache’的注释单元 if ($annotations->has('Cache')) { // 这个方法带有‘Cache’注释单元 $annotation = $annotations->get('Cache'); // 获取注释单元的‘lifetime’参数 $lifetime = $annotation->getNamedParameter('lifetime'); $options = array('lifetime' => $lifetime); // 检查注释单元中是否有用户定义的‘key’参数 if ($annotation->hasNamedParameter('key')) { $options['key'] = $annotation->getNamedParameter('key'); } // 为当前dispatcher访问的方法开启cache $this->view->cache($options); } } } 现在,我们可以使用注释单元在控制器中: .. code-block:: 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); } } Private/Public areas with Annotations ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You can use annotations to tell the ACL which controllers belong to the administrative areas: .. code-block:: 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( array( 'controller' => 'session', 'action' => 'login' ) ); return false; } } // Continue normally return true; } } 选择渲染模版(Choose the template to render) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 在这个例子中,当方法被执行的时候,我们将使用注释单元去告诉:doc:`Phalcon\\Mvc\\View\\Simple `,哪一个模板文件需要渲染: 注释适配器(Annotations Adapters) ---------------------------------- 这些组件利用了适配器去缓存或者不缓存已经解析和处理过的注释内容,从而提升了性能或者为开发环境提供了开发/测试的适配器: +------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------+ | Name | Description | API | +============+======================================================================================================================================================================================================================================+==========================================================================================+ | Memory | 这个注释只缓存在内存中。当请求结束时缓存将被清空,每次请求都重新解析注释内容. 这个适配器适合用于开发环境中 | :doc:`Phalcon\\Annotations\\Adapter\\Memory <../api/Phalcon_Annotations_Adapter_Memory>` | +------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------+ | Files | 已解析和已处理的注释将被永久保存在PHP文件中提高性能。这个适配器必须和字节码缓存一起使用。 | :doc:`Phalcon\\Annotations\\Adapter\\Files <../api/Phalcon_Annotations_Adapter_Files>` | +------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------+ | APC | 已解析和已处理的注释将永久保存在APC缓存中提升性能。 这是一个速度非常快的适配器。 | :doc:`Phalcon\\Annotations\\Adapter\\Apc <../api/Phalcon_Annotations_Adapter_Apc>` | +------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------+ | XCache | 已解析和已处理的注释将永久保存在XCache缓存中提升性能. 这也是一个速度非常快的适配器。 | :doc:`Phalcon\\Annotations\\Adapter\\Xcache <../api/Phalcon_Annotations_Adapter_Xcache>` | +------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------+ 自定义适配器(Implementing your own adapters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 为了建立自己的注释适配器或者继承一个已存在的适配器,这个 :doc:`Phalcon\\Annotations\\AdapterInterface <../api/Phalcon_Annotations_AdapterInterface>` 接口都必须实现。 外部资源(External Resources) ------------------------------ * `Tutorial: Creating a custom model's initializer with Annotations `_