grigor/yii2-generator

rest api 生成器

安装: 17

依赖: 1

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:yii2-extension

1.0.2 2021-03-07 23:34 UTC

This package is not auto-updated.

Last update: 2024-09-30 16:13:30 UTC


README

基于注释的yii2-rest扩展的rest api配置生成器。本质上,这是一个将注释中的注释转换为yii2-rest扩展所需设置的实用程序。它可以用于控制台或单独使用,具体取决于需求。

安装

推荐通过 composer 安装此扩展。

运行以下命令

php composer.phar require --prefer-dist grigor/yii2-generator "1.0.2"

或将其添加到 composer.json

"grigor/yii2-generator": "^1.0.2",

设置过程在 yii2-rest 扩展中描述。

系统有两个控制台命令

php yii generator/api/create
php yii generator/api/dev

generator/api/create 命令会扫描项目,查找注释中的设置,然后将其转换为yii2-rest扩展所需。可以在参数中指定要扫描的目录路径,这样就会只扫描指定的目录而不是整个项目。

输出将类似于以下内容

Начал сканировать директорию: /var/www/users
Найден метод: api\repositories\SomeServiceOrRepository::getDemoContextMethod(...);         
              Route:       /v1/context/demo/<id:[\w\-]+>
              Method:      GET
              Context:     api\context\FindModel
              Response:    201

Найден метод: api\repositories\SomeServiceOrRepository::getPhone(...);
              Route:       /v1/shop/phones/<id:[\w\-]+>
              Method:      GET
              Serializer:  api\serializers\SerializePhone

Найден метод: api\repositories\SomeServiceOrRepository::getAllPhones(...);
              Route:       /v1/shop/phones
              Method:      GET
              Serializer:  api\serializers\SerializePhone

Найден метод: api\repositories\SomeServiceOrRepository::createPhone(...);
              Route:       /v1/shop/phones
              Method:      POST
              Response:    201

Найден метод: api\repositories\SomeServiceOrRepository::createAndReturnPhone(...);
              Route:       /v2/shop/phones
              Method:      POST
              Response:    201

Найден метод: api\repositories\SomeServiceOrRepository::updatePhone(...);
              Route:       /v1/shop/phones/<id:[\w\-]+>
              Method:      PUT
              Response:    202
              Serializer:  api\serializers\SerializePhone

Завершил.                                                                                                               

Целевых файлов:............1 шт.
Методов:...................6 шт.
Просканировано:............9933 файлов
Затрачено времени:.........3.805 сек.

为了使注释在包含它们的类中生效,需要使用

use grigor\generator\annotation as API;

注释示例

    /**
     * @API\Route(
     *     url="/v1/shop/phones",
     *     methods={"GET"},
     *     alias="phones/index"
     * )
     * @API\Serializer("api\serializers\SerializePhone")
     * @return DataProviderInterface
     */
     public function getAllPhones(): DataProviderInterface

###注释中的所有设置

####@Route

Route(
     url="/v1/shop/phones",
     methods={"GET"},
     alias="phones/index"
 )

url - 处理的地址

methods - 指定 GET POST PUT 等方法

alias - 因为没有控制器,所以需要在代码中生成URL时指定此别名,这个别名用于在代码中生成链接 Yii::$app->urlManager->createUrl(["phones/index"]); 在正常模式下使用。

####@Serializer

Serializer("api\serializers\SerializePhone")

如果您想以不同的方式序列化返回对象,可以指定序列化器类。详细信息请参阅 yii2-rest

####@Permission

Permission({"admin", "user"})

如果您需要限制访问,可以列出权限和角色。

####@Context

Context("api\context\FindModel")

作用域限制器,可以称为findModel(类型)。它可以返回一个包含在运行中的方法中缺少的参数的数组。例如,我们有一个public function getProfile(string $id) 方法,而api应该返回当前用户的配置文件。也就是说,对于系统用户,没有参数id,所以URL大约是这样的 /v2/user/profile 方法 GET,所有,但我们使用public function getProfile(string $id) 在这里需要传递id user,在这种情况下是当前用户。详细信息请参阅 yii2-rest

####@Response

Response(statusCode="202")

如果需要返回与200不同的状态代码,则可以使用此注释。

###generator/api/dev 命令会扫描在应用程序设置中指定的文件夹,例如在 common/config/params.php 中

<?php
return [
    ...
    /**
     * Это пути где будут лежать настройки правил для рест апи и настройки методов которые будут отрабатывать в место actions.
     *
     * Если использовать yii2-generator, то лучше пути сразу писать без @alias или конвертировать
     * в относительный|реальный путь. Ниже будет описано почему или см. yii2-generator 
     * grigor\generator\tools\DeveloperTool::beforeAppRunScanDevDirectories($config);.
     */
    'serviceDirectoryPath' => Yii::getAlias('@api/data/static/services'),// тут будут лежать настройки методов.
    'rulesPath' => Yii::getAlias('@api/data/static/rules.php'), // тут сами правила со ссылками на настройки выше.
    /**
     * Параметр говорит генератору в каких папках ведется разработка ядра для апи, в общем случае где искать php файлы 
     * с аннотациями содержащими настройки для апи.
     * Этот параметр использует только yii2-generator, но он использует и параметры выше.
     */
    'devDirectories' => [
        Yii::getAlias('@api'),
    ]
    ...
];

在开发过程中,在每次更改注释后不希望在控制台中输入命令,可以进行以下操作:对 api/web 目录中的 index.php 文件进行操作,在启动应用程序之前添加以下行 grigor\generator\tools\DeveloperTool::beforeAppRunScanDevDirectories($config); 这个方法会在启动应用程序之前重新生成设置。整个过程可能看起来像这样

<?php

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/../../vendor/yiisoft/yii2/Yii.php';
require __DIR__ . '/../../common/config/bootstrap.php';
require __DIR__ . '/../config/bootstrap.php';

$config = yii\helpers\ArrayHelper::merge(
    require __DIR__ . '/../../common/config/main.php',
    require __DIR__ . '/../../common/config/main-local.php',
    require __DIR__ . '/../config/main.php',
    require __DIR__ . '/../config/main-local.php'
);
/*
//этот вариант подойдет если вы держите настройки rest api в базе.
if (!exec('cd ../../ && php yii generator/api/dev')) {
    throw \RuntimeException('Что то пошло не так.');
}
*/

grigor\generator\tools\DeveloperTool::beforeAppRunScanDevDirectories($config);
(new yii\web\Application($config))->run();

这些操作只能在开发时使用,请记住在产品环境中删除此行或配置环境。虽然系统运行得很快,但如果您的api方法非常多(超过数千个:)),则开始变慢,可以在配置中减少要扫描的文件夹数量(切换到当前文件夹)。

测试

composer tests