数据库 - Model 前置说明
官方开源项目 抓取代理IP

介绍

SW-X的注解主要依赖反射类实现,只对控制器对应的入口方法有效。

服务会在启动阶段扫描控制器目录下的全部文件,并解析出相应的注解写入内存当中。

后续当请求进来时,会直接在内存中读取路由表以及对应的注解标签,所以性能消耗非常低。

注解支持范围

由于注解是基于路由表实现的依赖注入,所以注解只对路由加载的主控制器方法有效,当再主方法内调用其他成员方法,又或者跨控制器调用它类方法时,依旧只有主控制器的注解有效。

下面我们用一个HTTP的控制器来讲解下:

<?php
namespace app\http;
use x\controller\Http;

class Index extends Http
{
    /**
     * 输出视图
     * @RequestMapping(route="/", method="get", title="主页")
    */
    public function index() {
        $Db = $this->test();
    }

    /**
     * @Ioc(class="\x\Db", name="Db")
     * @RequestMapping(route="/test", method="post", title="测试获取")
    */
    public function test() {
        var_dump($this->Db);
        return $this->Db;
    }
}

上面的方法,在我们访问/test路由的时候,Db属性是注入成功的,
但当我们访问/路由的时候就会发现,test()方法是错误的,因为注解没有被继承,所以@Ioc注解实际上并没有执行。

SW-X的注解,只对被路由器载入的控制器主方法有效。

当然,调用流程上,主方法挂载的注解,其流程上调用到的后续方法都可以使用。

注解规范

SW-X中使用注解注入需要极强的规范要求,否则注解会解析失败,具体要求如下:

  • 注解必须在/** */注释体内所包含
  • 一行注释为一条注解
  • 只对框架内置的注解元有效
  • 每条注解中的属性参数,都必须使用双引号做标记,例如:@Ioc(class="依赖的类", name="注入的成员属性名称")
  • 基本所有注解都是属性名称="",的方式传递参数,都是强制""双引号,后面接入一个,英文逗号


SW-X中支持的所有注解元如下,也可以参考这个作为注解的使用规范:


/**
 * @TestCase(class="\box\testcase\index\test1", title="用例一")
 * @Ioc(class="\x\Db", function="name('user')", name="Db")
 * @AopBefore(class="app\aop\Demo", function="before")
 * @AopAfter(class="app\aop\Demo", function="after")
 * @AopAround(class="app\aop\Demo", function="around")
 * @AopThrows(class="app\aop\Demo", function="throws")
 * @Param(name="id", type="int|string", value="1", empty="true", min="10", max="20", chinese="true", callback="\lifecycle\annotate_param")
 * @RequestMapping(route="/index", method="GET|POST", title="路由描述")
 * @Controller(prefix="user")
 * @onRoute
*/

每个注解元的解释如下:

  • TestCase:单元测试绑定
  • Ioc:依赖注入
  • AopBefore:AOP前置操作
  • AopAfter:AOP后置操作
  • AopAround:AOP环绕操作
  • AopThrows:AOP异常转发
  • RequestMapping:方法对应的路由绑定
  • Controller:控制器的前置路由绑定
  • onRoute:申明某个方法不能被路由访问
  • Param:对GET或POST参数进行前置校验

SW-X

企业级 - 高性能 PHP 框架

最后更新:3年前 . 作者-小黄牛

本篇目录