grigor / yii2-generator
rest api 生成器
Requires
- php: >=7.4
- doctrine/annotations: ^1.10.4
- grigor/scanner: ~1.0.1
- psr/container: ^1.0.0
- ramsey/uuid: ^4.1
- yiisoft/yii2: ~2.0.0
Requires (Dev)
- phpunit/phpunit: 8.5.x-dev
- yidas/yii2-composer-bower-skip: ~2.0.0
- yiisoft/yii2-bootstrap: ~2.0.0
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