写点什么

Phalcon 注解学习

用户头像
半亩房顶
关注
发布于: 2020 年 08 月 14 日
Phalcon注解学习

踩坑记录一则:未加注解导致无法访问

1、背景和目的

工作中重构代码时,需要将部分app(someClass:class)方式的仓库层、service层调用,替换为构造函数注入的方式来实现,从而让IDE更好的为我们工作(app方式其实也是依赖注入,参见关联资料3)

2、问题追查

新建了path/AController的默认构造函数,并保留了abstractController的构造函数

public function __construct(
service1 $service1,
service2 $service2,
) {
$this->_service1 = $service1;
$this->_service2 = $service2;

parent::__construct();
}

看上去没有问题,但是确实始终遇到报错,按堆栈信息跟踪报错后发现,是一个注解方式没有标记导致的的:@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)可以轻松获取被定义在类中的注解,使用一个面向对象的接口即可:

<?php

$reader = new \Phalcon\Annotations\Adapter\Memory();

//获取 Example 类的注解
$reflector = $reader->get('Example');

//读取‘类注释’中的注解
$annotations = $reflector->getClassAnnotations();

//遍历注解
foreach ($annotations as $annotation) {

//打印注解名称
echo $annotation->getName(), PHP_EOL;

//打印参数个数
echo $annotation->numberArguments(), PHP_EOL;

//打印参数
print_r($annotation->getArguments());
}

虽然这个注解的读取过程是非常快速的,然而,出于性能原因,我们建议使用一个适配器储存解析后的注解内容。 适配器把处理后的注解内容缓存起来,避免每次读取都需要解析一遍注解。

Phalcon\Annotations\Adapter\Memory 被用在上面的例子中。这个适配器只在请求过程中缓存注解,请求完成后缓存将被清空,因为这个原因,这个适配器非常适合用于开发环境中。当应用跑在生产环境中还有其他适配器可以替换。



3、注解适配器Annotations Adapters

这些组件利用了适配器去缓存或者不缓存已经解析和处理过的注解内容,从而提升了性能或者为开发环境提供了开发/测试的适配器:



Phalcon\Annotations\Adapter\Memory

Phalcon\Annotations\Adapter\Files

Phalcon\Annotations\Adapter\Apc

Phalcon\Annotations\Adapter\Xcache

APC cache

XCache cache



了解了这些我们就可以了解注解是如何工作的,如何与我们的代码协作的。仅做初步了解下,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) 实现方式

if (!function_exists('app')) {
/**
* Get the available container instance.
*
* @param string $make
* @param array $parameters
* @return mixed|Application
*/
function app($make = null, $parameters = [])
{
if (is_null($make)) {
return \Phalcon\Di::getDefault();
}

return \Phalcon\Di::getDefault()['maker']->make($make, $parameters);
}
}



4、三款免费的PHP加速器:APC、eAccelerator、XCache比较



欢迎大佬们指点

以上,共勉


欢迎大家关注我的公众号



发布于: 2020 年 08 月 14 日阅读数: 57
用户头像

半亩房顶

关注

人生那么长,能写多少bug? 2018.11.16 加入

我希望,自己永远是自己。我希望,远离bug。

评论

发布
暂无评论
Phalcon注解学习