Phalcon 注解学习
踩坑记录一则:未加注解导致无法访问
1、背景和目的
工作中重构代码时,需要将部分app(someClass:class)方式的仓库层、service层调用,替换为构造函数注入的方式来实现,从而让IDE更好的为我们工作(app方式其实也是依赖注入,参见关联资料3)
2、问题追查
新建了path/AController的默认构造函数,并保留了abstractController的构造函数
看上去没有问题,但是确实始终遇到报错,按堆栈信息跟踪报错后发现,是一个注解方式没有标记导致的的:@roles('XXX')
,对于功能是校验用户角色
3、解决方案
解决方案很简单,添加注解即可,但是这个注解究竟是什么呢?挖一下
Phalcon注解学习
1、注解解析器 Annotations Parser
这是第一个为PHP用C语言写的注解解析器。 Phalcon\Annotations是一个通用组件,为应用中的PHP类提供易于解析和缓存注解的功能。
注解位置:读自类,方法和属性的注解区域。一个注解单元可以放在注解区域的任何位置。
注解结构:@注解名称[(参数1, 参数2, ...)],注解单元可以有参数也可以没有。
注解类型:(Types of Annotations)注解的参数可以为简单的文字(strings, number, boolean, null),数组,哈希列表或者其他注解单元
2、读取注解 Reading Annotations
实现反射器(Reflector)可以轻松获取被定义在类中的注解,使用一个面向对象的接口即可:
虽然这个注解的读取过程是非常快速的,然而,出于性能原因,我们建议使用一个适配器储存解析后的注解内容。 适配器把处理后的注解内容缓存起来,避免每次读取都需要解析一遍注解。
Phalcon\Annotations\Adapter\Memory 被用在上面的例子中。这个适配器只在请求过程中缓存注解,请求完成后缓存将被清空,因为这个原因,这个适配器非常适合用于开发环境中。当应用跑在生产环境中还有其他适配器可以替换。
3、注解适配器Annotations Adapters
这些组件利用了适配器去缓存或者不缓存已经解析和处理过的注解内容,从而提升了性能或者为开发环境提供了开发/测试的适配器:
Phalcon\Annotations\Adapter\Memory
Phalcon\Annotations\Adapter\Files
Phalcon\Annotations\Adapter\Apc
Phalcon\Annotations\Adapter\Xcache
了解了这些我们就可以了解注解是如何工作的,如何与我们的代码协作的。仅做初步了解下,phalcon注解底层实现尚未深挖,暂且留做后续研究题目,也欢迎大佬们分享、指点
拓展
PHP并没有内置的注解功能,现有很多注解的解析、存储、注入等功能,其原理其实是使用的反射类来实现的IOC和AOP,下面是一些拓展资料:
关联资料
1、注解解析器Annotations Parser
https://phalcon-doc-cn.readthedocs.io/zh_CN/latest/reference/annotations.html#annotations-parser
2、Class *Phalcon\\Annotations\\Adapter\\Memory*
http://docs.iphalcon.cn/api/PhalconAnnotationsAdapter_Memory.html#class-phalcon-annotations-adapter-memory
3、Phalcon app(someClass:class) 实现方式
4、三款免费的PHP加速器:APC、eAccelerator、XCache比较
欢迎大佬们指点
以上,共勉
欢迎大家关注我的公众号
版权声明: 本文为 InfoQ 作者【半亩房顶】的原创文章。
原文链接:【http://xie.infoq.cn/article/2ac5c72b5f7105300a0f864c9】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论