专栏首页LaravelCodeHyperf 初体验-注解

Hyperf 初体验-注解

什么是注解什么是注释?

注解注释 的区别:

  • 注释:给程序员看,帮助理解代码,对代码起到解释、说明的作用。
  • 注解:给应用程序看,用于元数据的定义,单独使用时没有任何作用,需配合应用程序对其元数据进行利用才有作用。

PHP 语法本身并没有实支持 注解 ,实现注解只能从注释中解析。

Hyperf 使用注解的几种方式

  • 类方法
  • 类属性

创建注解

自定义注解

在 Hyperf 项目 app 目录中创建一个 Annotation 文件夹 比如创建一个 User 类,那么位置就是 app\Annotation\User.php

类注解
namespace App\Annotation;
<?php

use Hyperf\Di\Annotation\AbstractAnnotation;

/**
 * @Annotation
 * @Target("CLASS")
 */
class User extends AbstractAnnotation
{

}
方法注解
<?php

namespace App\Annotation;

use Hyperf\Di\Annotation\AbstractAnnotation;

/**
 * @Annotation
 * @Target("METHOD")
 */
class User extends AbstractAnnotation
{

}
类成员属性注解
<?php

namespace App\Annotation;

use Hyperf\Di\Annotation\AbstractAnnotation;

/**
 * @Annotation
 * @Target("PROPERTY")
 */
class User extends AbstractAnnotation
{

}
或者默认支持以上三种所有注解
<?php

namespace App\Annotation;

use Hyperf\Di\Annotation\AbstractAnnotation;

/**
 * @Annotation
 * @Target("ALL")
 */
class User extends AbstractAnnotation
{

}
数组方式

假如同时想要支持 METHODCLASS 两种注解,那么就可以采用 {"CLASS","METHOD"} 这种方式

<?php

namespace App\Annotation;

use Hyperf\Di\Annotation\AbstractAnnotation;

/**
 * @Annotation
 * @Target({"CLASS","METHOD"})
 */
class User extends AbstractAnnotation
{

}

@Target 主要用于指定该注解默认的级别是 类注解、还是方法、或者是类成员属性 可以看到定义注解其实就是在 注释上增加两个类似 "方法" 的东西 注意注解类的 @Annotation 和 @Target 注解为全局注解,所以无需 use ,引入命名空间

注解参数传递

假如注解需要接收参数该怎么处理呢?在注解中定义一个属性

<?php

namespace App\Annotation;

use Hyperf\Di\Annotation\AbstractAnnotation;

/**
 * @Annotation
 * @Target({"CLASS","METHOD"})
 */
class User extends AbstractAnnotation
{
    /**
     * @var string
     */
    public $name;
}

自定义注解收集器

<?php
namespace App\Annotation;

use Hyperf\Di\Annotation\AnnotationInterface;

/**
 * @Annotation
 * @Target({"CLASS","METHOD","PROPERTY"})
 */
class User implements AnnotationInterface
{
    /**
     * @var string
     */
    public $name;

    /**
     * Collect the annotation metadata to a container that you wants.
     */
    public function collectClass(string $className): void
    {
        // TODO: Implement collectClass() method.
    }

    /**
     * Collect the annotation metadata to a container that you wants.
     */
    public function collectMethod(string $className, ?string $target): void
    {
        // TODO: Implement collectMethod() method.
    }

    /**
     * Collect the annotation metadata to a container that you wants.
     */
    public function collectProperty(string $className, ?string $target): void
    {
        // TODO: Implement collectProperty() method.
    }
}

使用注解

上面我们定义注解,是支持三种方式, CLASSMETHODPROPERTY,所有使用也是这三种方式

我们用 IndexController 来测试,注解是否可以正确接收参数

<?php

declare(strict_types=1);

namespace App\Controller;

use App\Annotation\User;
use Hyperf\Di\Annotation\AnnotationCollector;
use Hyperf\HttpServer\Annotation\AutoController;

/**
 * @AutoController()
 * @User(name="123")
 */
class IndexController extends Controller
{
    public function index()
    {
        var_dump(AnnotationCollector::getClassByAnnotation(User::class));
        return 'Hello Hyperf!';
    }
}

然后请求下地址 http://127.0.0.1:9501/index/index 路由。 控制台会直接返回

我们这是采用字符串的参数传递,但是看文档还有一种直接传递值的方法,我们来试下,看能不能正确接收.

...
/**
 * @AutoController()
 * @User("123")
 */
class IndexController extends Controller
{
    public function index()
    {
        var_dump(AnnotationCollector::getClassByAnnotation(User::class));
        return 'Hello Hyperf!';
    }
}

然后再次请求下地址,看有没有正确接收值。我们看到注解并没有接收到这个值.

那么到底该怎样接收这个值呢?重写我们的注解类,重写构造函数 ,注解类有一个 设置主属性的方式。

<?php
namespace App\Annotation;
use Hyperf\Di\Annotation\AbstractAnnotation;

/**
 * @Annotation
 * @Target({"CLASS","METHOD"})
 */
class User extends AbstractAnnotation
{
    /**
     * @var string
     */
    public $name;

    public function __construct($value = null)
    {
        parent::__construct($value);
        $this->bindMainProperty('name',$value);
    }
}

再次请求下地址,即可返回

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 文本域实现图片拖拽上传

    相信你看到过不少文件拖拽上传的功能,很多论坛、社区比比皆是。所以今天就来操作一番。

    hedeqiang
  • Vuejs 计算属性

    计算属性 (computed) 处理元数据,便于进行二次利用。(比如:消费税自动计算功能)

    hedeqiang
  • 解决Yii2.0 高级版不能使用内置服务器的问题

    今天社区一个小伙伴给我留言说是 Yii 框架可不可以像 Laravel 一样直接使用内置服务器直接跑起项目 在Laravel 中 直接:

    hedeqiang
  • 大数据周周看 | 浙江移动发布神秘利器“照妖镜”,Twitter账号安全再陷危机

    本周,联想公司成立“数据中心业务集团”,Twitter账号安全再陷危机,海致BDP与移动程序化广告平台Avazu就数据化精准营销达成合作……更多大数据事件请关注...

    数据猿
  • 【DMP篇】15个DMP相关经典问题集锦

    Q1:宋老师您好,我目前在互联网公司负责营销中心DMP的搭建工作,想向您请教几个问题:

    iCDO互联网数据官
  • 5大数据挑战正在改变数据中心的面貌

    引言:新的数据中心架构提出了新的数据挑战——数据捕获是如何驱动边缘到核心的数据中心架构的。

    全球资讯翻译官
  • R语言实现肿瘤细胞计数

    今天给大家介绍一个病理图像中肿瘤细胞计数的图像处理包CRImage。此包对R语言的版本要求比较高,必须是不低于3.6版本的R语言才可以安装。安装需要的前期准备:

    一粒沙
  • 博晓通创始人&CEO 张宇:对于大数据的理解,目前仍存在4个误区

    数据猿导读 大数据作为技术热点和转型升级的支撑工具,不管是个人、企业和政府都很期待。但2016年在解决用户实际问题的过程中,发现用户对大数据的理解上存在一些误区...

    数据猿
  • 数据猿专访丨联想集团副总裁田日辉:从制造到用户体验,大数据已深入到所有环节

    <数据猿导读> 数据猿在专访联想集团副总裁田日辉的时候,他提到,大数据在联想的应用已经深入到各个角落,所有的部门都在深入使用大数据来进行业务优化和产品优化。通过...

    数据猿
  • 数据的开放与共享,你做好准备了吗?

    数据的开放和共享是两个完全不同的概念。数据的开放是从数据源头开放,其他人能够获得原始的数据,并对数据进行加工和处理,是毫无隐藏的开放;而数据的共享则是将数据加工...

    明悦数据

扫码关注云+社区

领取腾讯云代金券