• 声明服务
  • 接口服务
    • 目录定义
    • 定义接口
    • 接口实现
      • 注解
      • 实例

    声明服务

    接口服务

    定义接口并实现接口,才能提供RPC服务。

    目录定义

    官方应用中给出的目录如下:

    1. app/
    2. Rpc/
    3. - Lib/ // 服务的公共接口定义目录,里面通常只有php接口类
    4. - Services/ // 具体的服务接口实现类,里面的类通常实现了 Lib 中定义的接口

    当然在多个服务中使用时, 要将lib库 app/Rpc/Lib 移到一个公共的git仓库里,然后各个服务通过 composer 来获取使用

    定义接口

    服务提供方定义好接口格式,存放到公共的lib库里面,服务调用方,加载lib库,就能使用接口服务,接口定义和普通接口完全一致。

    1. **
    2. * Class UserInterface
    3. *
    4. * @since 2.0
    5. */
    6. interface UserInterface
    7. {
    8. /**
    9. * @param int $id
    10. * @param mixed $type
    11. * @param int $count
    12. *
    13. * @return array
    14. */
    15. public function getList(int $id, $type, int $count = 10): array;
    16. /**
    17. * @param int $id
    18. *
    19. * @return bool
    20. */
    21. public function delete(int $id): bool;
    22. /**
    23. * @return string
    24. */
    25. public function getBigContent(): string;
    26. }

    接口实现

    一个接口,会存在多种不同的实现,通过一个版本号来标识是那个逻辑实现。

    注解

    @Service

    • version 定义接口版本,默认是 1.0

    实例

    实现版本1

    1. /**
    2. * Class UserService
    3. *
    4. * @since 2.0
    5. *
    6. * @Service()
    7. */
    8. class UserService implements UserInterface
    9. {
    10. /**
    11. * @param int $id
    12. * @param mixed $type
    13. * @param int $count
    14. *
    15. * @return array
    16. */
    17. public function getList(int $id, $type, int $count = 10): array
    18. {
    19. return ['name' => ['list']];
    20. }
    21. /**
    22. * @param int $id
    23. *
    24. * @return bool
    25. */
    26. public function delete(int $id): bool
    27. {
    28. return false;
    29. }
    30. /**
    31. * @return string
    32. */
    33. public function getBigContent(): string
    34. {
    35. $content = Co::readFile(__DIR__ . '/big.data');
    36. return $content;
    37. }
    38. }

    实现版本2

    1. /**
    2. * Class UserServiceV2
    3. *
    4. * @since 2.0
    5. *
    6. * @Service(version="1.2")
    7. */
    8. class UserServiceV2 implements UserInterface
    9. {
    10. /**
    11. * @param int $id
    12. * @param mixed $type
    13. * @param int $count
    14. *
    15. * @return array
    16. */
    17. public function getList(int $id, $type, int $count = 10): array
    18. {
    19. return [
    20. 'name' => ['list'],
    21. 'v' => '1.2'
    22. ];
    23. }
    24. /**
    25. * @param int $id
    26. *
    27. * @return bool
    28. */
    29. public function delete(int $id): bool
    30. {
    31. return false;
    32. }
    33. /**
    34. * @return string
    35. */
    36. public function getBigContent(): string
    37. {
    38. $content = Co::readFile(__DIR__ . '/big.data');
    39. return $content;
    40. }
    41. }

    不同的实现,需要定义不同的唯一版本号,如果存在相同,加载之后的服务会覆盖之前的服务