tw2066 / api-docs Goto Github PK
View Code? Open in Web Editor NEWLicense: MIT License
License: MIT License
dto
<?php
namespace App\Dto\Admin\Carousel;
use App\Dto\BaseDto;
use Hyperf\ApiDocs\Annotation\ApiModelProperty;
use Hyperf\DTO\Annotation\Validation\Validation;
class CarouselUpdateDto extends BaseDto {
#[ApiModelProperty('分类')]
public $category_id;
#[ApiModelProperty('图片')]
#[Validation('array')]
public $imgs;
#[ApiModelProperty('链接类型')]
public $type;
#[ApiModelProperty('链接')]
public $link;
#[ApiModelProperty('启用状态')]
public $enable;
#[ApiModelProperty('排序值')]
public $sort;
}
数据
{"carousel_id":1,"category_id":8,"imgs":[{"filename":"uploadlib-.png","type":"image","url":"http://127.0.0.1:9601/res-lib/upload/uploadlib-1653622489404.20221123143058.png","preview_url":"http://127.0.0.1:9601/res-lib/upload/uploadlib-1653622489404.20221123143058.png"}],"type":"none","link":null,"enable":1,"sort":1,"created_at":"2023-01-13 16:39:51","updated_at":"2023-01-13 17:55:31","deleted_at":null}
错误日志
Fatal error: Uncaught JsonMapper_Exception: JSON property "link" in class "App\Dto\Admin\Carousel\CarouselUpdateDto" must not be NULL in /data/www/hyperf-admin/vendor/netresearch/jsonmapper/src/JsonMapper.php:216
Stack trace:
#0 /data/www/hyperf-admin/vendor/tangwei/dto/src/Mapper.php(17): JsonMapper->map(Array, Object(App\Dto\Admin\Carousel\CarouselUpdateDto))
#1 /data/www/hyperf-admin/vendor/tangwei/dto/src/Middleware/CoreMiddleware.php(119): Hyperf\DTO\Mapper::map(Array, Object(App\Dto\Admin\Carousel\CarouselUpdateDto))
#2 /data/www/hyperf-admin/vendor/tangwei/dto/src/Middleware/CoreMiddleware.php(72): Hyperf\DTO\Middleware\CoreMiddleware->validateAndMap('App\\Controller\\...', 'dto', 'App\\Dto\\Admin\\C...', Object(App\Dto\Admin\Carousel\CarouselUpdateDto))
#3 /data/www/hyperf-admin/vendor/tangwei/dto/src/Middleware/CoreMiddleware.php(25): Hyperf\DTO\Middleware\CoreMiddleware->getInjections(Array, 'App\\Controller\\...', Array)
#4 /data/www/hyperf-admin/vendor/hyperf/http-server/src/CoreMiddleware.php(160): Hyperf\DTO\Middleware\CoreMiddleware->parseMethodParameters('App\\Controller\\...', 'update', Array)
#5 /data/www/hyperf-admin/vendor/hyperf/http-server/src/CoreMiddleware.php(113): Hyperf\HttpServer\CoreMiddleware->handleFound(Object(Hyperf\HttpServer\Router\Dispatched), Object(Hyperf\HttpMessage\Server\Request))
#6 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/AbstractRequestHandler.php(64): Hyperf\HttpServer\CoreMiddleware->process(Object(Hyperf\HttpMessage\Server\Request), Object(Hyperf\Dispatcher\HttpRequestHandler))
#7 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/HttpRequestHandler.php(26): Hyperf\Dispatcher\AbstractRequestHandler->handleRequest(Object(Hyperf\HttpMessage\Server\Request))
#8 /data/www/hyperf-admin/runtime/container/proxy/App_Core_RBAC_Middleware_RBACMiddleware.proxy.php(49): Hyperf\Dispatcher\HttpRequestHandler->handle(Object(Hyperf\HttpMessage\Server\Request))
#9 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/AbstractRequestHandler.php(64): App\Core\RBAC\Middleware\RBACMiddleware->process(Object(Hyperf\HttpMessage\Server\Request), Object(Hyperf\Dispatcher\HttpRequestHandler))
#10 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/HttpRequestHandler.php(26): Hyperf\Dispatcher\AbstractRequestHandler->handleRequest(Object(Hyperf\HttpMessage\Server\Request))
#11 /data/www/hyperf-admin/app/Core/Auth/Aspect/AuthMiddlewareAspect.php(45): Hyperf\Dispatcher\HttpRequestHandler->handle(Object(Hyperf\HttpMessage\Server\Request))
#12 /data/www/hyperf-admin/vendor/hyperf/di/src/Aop/Pipeline.php(30): App\Core\Auth\Aspect\AuthMiddlewareAspect->process(Object(Hyperf\Di\Aop\ProceedingJoinPoint))
#13 /data/www/hyperf-admin/vendor/hyperf/utils/src/Pipeline.php(95): Hyperf\Di\Aop\Pipeline->Hyperf\Di\Aop\{closure}(Object(Hyperf\Di\Aop\ProceedingJoinPoint))
#14 /data/www/hyperf-admin/vendor/hyperf/di/src/Aop/ProxyTrait.php(86): Hyperf\Utils\Pipeline->then(Object(Closure))
#15 /data/www/hyperf-admin/vendor/hyperf/di/src/Aop/ProxyTrait.php(29): Qbhy\HyperfAuth\AuthMiddleware::handleAround(Object(Hyperf\Di\Aop\ProceedingJoinPoint))
#16 /data/www/hyperf-admin/runtime/container/proxy/Qbhy_HyperfAuth_AuthMiddleware.proxy.php(49): Qbhy\HyperfAuth\AuthMiddleware::__proxyCall('Qbhy\\HyperfAuth...', 'process', Array, Object(Closure))
#17 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/AbstractRequestHandler.php(64): Qbhy\HyperfAuth\AuthMiddleware->process(Object(Hyperf\HttpMessage\Server\Request), Object(Hyperf\Dispatcher\HttpRequestHandler))
#18 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/HttpRequestHandler.php(26): Hyperf\Dispatcher\AbstractRequestHandler->handleRequest(Object(Hyperf\HttpMessage\Server\Request))
#19 /data/www/hyperf-admin/vendor/hyperf/validation/src/Middleware/ValidationMiddleware.php(83): Hyperf\Dispatcher\HttpRequestHandler->handle(Object(Hyperf\HttpMessage\Server\Request))
#20 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/AbstractRequestHandler.php(64): Hyperf\Validation\Middleware\ValidationMiddleware->process(Object(Hyperf\HttpMessage\Server\Request), Object(Hyperf\Dispatcher\HttpRequestHandler))
#21 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/HttpRequestHandler.php(26): Hyperf\Dispatcher\AbstractRequestHandler->handleRequest(Object(Hyperf\HttpMessage\Server\Request))
#22 /data/www/hyperf-admin/runtime/container/proxy/App_Core_RespFmt_Middleware_RespFmtMiddleware.proxy.php(35): Hyperf\Dispatcher\HttpRequestHandler->handle(Object(Hyperf\HttpMessage\Server\Request))
#23 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/AbstractRequestHandler.php(64): App\Core\RespFmt\Middleware\RespFmtMiddleware->process(Object(Hyperf\HttpMessage\Server\Request), Object(Hyperf\Dispatcher\HttpRequestHandler))
#24 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/HttpRequestHandler.php(26): Hyperf\Dispatcher\AbstractRequestHandler->handleRequest(Object(Hyperf\HttpMessage\Server\Request))
#25 /data/www/hyperf-admin/runtime/container/proxy/App_Core_Utils_Middleware_LanguageMiddleware.proxy.php(30): Hyperf\Dispatcher\HttpRequestHandler->handle(Object(Hyperf\HttpMessage\Server\Request))
#26 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/AbstractRequestHandler.php(64): App\Core\Utils\Middleware\LanguageMiddleware->process(Object(Hyperf\HttpMessage\Server\Request), Object(Hyperf\Dispatcher\HttpRequestHandler))
#27 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/HttpRequestHandler.php(26): Hyperf\Dispatcher\AbstractRequestHandler->handleRequest(Object(Hyperf\HttpMessage\Server\Request))
#28 /data/www/hyperf-admin/app/Core/Utils/Middleware/CorsMiddleware.php(32): Hyperf\Dispatcher\HttpRequestHandler->handle(Object(Hyperf\HttpMessage\Server\Request))
#29 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/AbstractRequestHandler.php(64): App\Core\Utils\Middleware\CorsMiddleware->process(Object(Hyperf\HttpMessage\Server\Request), Object(Hyperf\Dispatcher\HttpRequestHandler))
#30 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/HttpRequestHandler.php(26): Hyperf\Dispatcher\AbstractRequestHandler->handleRequest(Object(Hyperf\HttpMessage\Server\Request))
#31 /data/www/hyperf-admin/vendor/hyperf/dispatcher/src/HttpDispatcher.php(40): Hyperf\Dispatcher\HttpRequestHandler->handle(Object(Hyperf\HttpMessage\Server\Request))
#32 /data/www/hyperf-admin/vendor/hyperf/http-server/src/Server.php(117): Hyperf\Dispatcher\HttpDispatcher->dispatch(Object(Hyperf\HttpMessage\Server\Request), Array, Object(Hyperf\DTO\Middleware\CoreMiddleware))
#33 {main}
thrown in /data/www/hyperf-admin/vendor/netresearch/jsonmapper/src/JsonMapper.php on line 216
[2023-01-13 18:06:29 *1265.0] WARNING Channel::~Channel() (ERRNO 10003): channel is destroyed, 2 consumers will be discarded
PHP Fatal error: Uncaught Swoole\Error: API must be called in the coroutine in /data/www/hyperf-admin
有些时候后端接口对外定义的传参/返回都是下划线命名风格,但是类成员变量通常是推荐驼峰命名方式的,那么必然就存在一个传参下换线,转换成驼峰的场景;以及在返回时,将驼峰命名的转换成下划线
能否将JSONField的这个info日志注掉或者变更为debug级别的?
当我定义个一个从头获取参数的类,Header中的名称和我实际要的属性名不一致,所以使用JSONField来设定别名。
#[JSONField('x-webhook-sender')] public string $sender;
但是,当我在请求头中带回来的比如UserAgent等参数,确实不需要,但是会报出一堆info日志。。。
[2023-08-01 13:11:40] [INFO] Property {property} does not exist in {class}
[2023-08-01 13:11:40] [INFO] Property {property} does not exist in {class}
[2023-08-01 13:11:40] [INFO] Property {property} does not exist in {class}
[2023-08-01 13:11:40] [INFO] Property {property} does not exist in {class}
[2023-08-01 13:11:40] [INFO] Property {property} does not exist in {class}
[2023-08-01 13:11:40] [INFO] Property {property} does not exist in {class}
[2023-08-01 13:11:40] [INFO] Property {property} does not exist in {class}
.....
update场景中使用unique时注解怎么排除当前id
考虑适配hyperf-3.0了吗?
php bin/hyperf.php vendor:publish tangwei/apidocs
2.0版本报错下面的是什么轻快
There are no commands defined in the "vendor" namespace.
use HyperfTest\HttpTestCase;
class ExampleTest extends HttpTestCase
{
public function test_example()
{
$this->json('/', ['foo' => 'bar'])
}
}
能否像java 的 dto 一样使用继承。
多个api, 都有相同的参数,把相同参数提取成超类; 然后注解验证,同时也能生成swagger 文档后也会包含父类的属性参数。
修改了此配置后
return [
// enable false 将不会启动 swagger 服务
'enable' => false,
'format' => 'json',
...
];
修改了以上配置 然后启动就报错了
报错:
Fatal error: Uncaught Error: Typed static property Hyperf\ApiDocs\Listener\BootAppRouteListener::$massage must not be accessed before initialization in /cygdrive/f/xycphp/php8/lsk-
报错如下
PHP Fatal error: Uncaught Error: Call to undefined method phpDocumentor\Reflection\DocBlock\Tags\See::getType() in /data/www/hyperf-admin/vendor/tangwei/dto/src/JsonMapper.php:177
Stack trace:
#0 /data/www/hyperf-admin/vendor/tangwei/dto/src/JsonMapper.php(100): Hyperf\DTO\JsonMapper->parseAnnotationsNew(Object(ReflectionClass), Object(ReflectionProperty), '/**\n * The ...')
#1 /data/www/hyperf-admin/vendor/netresearch/jsonmapper/src/JsonMapper.php(167): Hyperf\DTO\JsonMapper->inspectProperty(Object(ReflectionClass), 'scheme')
#2 /data/www/hyperf-admin/vendor/tangwei/dto/src/Mapper.php(17): JsonMapper->map(Array, Object(OpenApi\Attributes\SecurityScheme))
#3 /data/www/hyperf-admin/vendor/tangwei/apidocs/src/Swagger/SwaggerOpenApi.php(104): Hyperf\DTO\Mapper::map(Array, Object(OpenApi\Attributes\SecurityScheme))
#4 /data/www/hyperf-admin/vendor/tangwei/apidocs/src/Swagger/SwaggerOpenApi.php(43): Hyperf\ApiDocs\Swagger\SwaggerOpenApi->setComponentsSecuritySchemes()
#5 /data/www/hyperf-admin/vendor/tangwei/apidocs/src/Listener/AfterDtoStartListener.php(52): Hyperf\ApiDocs\Swagger\SwaggerOpenApi->init()
#6 /data/www/hyperf-admin/vendor/hyperf/event/src/EventDispatcher.php(48): Hyperf\ApiDocs\Listener\AfterDtoStartListener->process(Object(Hyperf\DTO\Event\AfterDtoStart))
#7 /data/www/hyperf-admin/vendor/tangwei/dto/src/BeforeServerListener.php(63): Hyperf\Event\EventDispatcher->dispatch(Object(Hyperf\DTO\Event\AfterDtoStart))
#8 /data/www/hyperf-admin/vendor/hyperf/event/src/EventDispatcher.php(48): Hyperf\DTO\BeforeServerListener->process(Object(Hyperf\Framework\Event\BeforeServerStart))
#9 /data/www/hyperf-admin/vendor/hyperf/server/src/Server.php(131): Hyperf\Event\EventDispatcher->dispatch(Object(Hyperf\Framework\Event\BeforeServerStart))
#10 /data/www/hyperf-admin/vendor/hyperf/server/src/Server.php(72): Hyperf\Server\Server->initServers(Object(Hyperf\Server\ServerConfig))
#11 /data/www/hyperf-admin/vendor/hyperf/server/src/ServerFactory.php(56): Hyperf\Server\Server->init(Object(Hyperf\Server\ServerConfig))
#12 /data/www/hyperf-admin/vendor/hyperf/server/src/Command/StartServer.php(52): Hyperf\Server\ServerFactory->configure(Array)
#13 /data/www/hyperf-admin/vendor/symfony/console/Command/Command.php(298): Hyperf\Server\Command\StartServer->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#14 /data/www/hyperf-admin/vendor/symfony/console/Application.php(1042): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#15 /data/www/hyperf-admin/vendor/symfony/console/Application.php(299): Symfony\Component\Console\Application->doRunCommand(Object(Hyperf\Server\Command\StartServer), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#16 /data/www/hyperf-admin/vendor/symfony/console/Application.php(171): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#17 /data/www/hyperf-admin/bin/hyperf.php(23): Symfony\Component\Console\Application->run()
#18 /data/www/hyperf-admin/bin/hyperf.php(24): {closure}()
#19 /data/www/hyperf-admin/vendor/hyperf/watcher/watcher.php(22): require_once('/data/www/hyper...')
#20 {main}
thrown in /data/www/hyperf-admin/vendor/tangwei/dto/src/JsonMapper.php on line 177
Fatal error: Uncaught Error: Call to undefined method phpDocumentor\Reflection\DocBlock\Tags\See::getType() in /data/www/hyperf-admin/vendor/tangwei/dto/src/JsonMapper.php:177
Stack trace:
#0 /data/www/hyperf-admin/vendor/tangwei/dto/src/JsonMapper.php(100): Hyperf\DTO\JsonMapper->parseAnnotationsNew(Object(ReflectionClass), Object(ReflectionProperty), '/**\n * The ...')
#1 /data/www/hyperf-admin/vendor/netresearch/jsonmapper/src/JsonMapper.php(167): Hyperf\DTO\JsonMapper->inspectProperty(Object(ReflectionClass), 'scheme')
#2 /data/www/hyperf-admin/vendor/tangwei/dto/src/Mapper.php(17): JsonMapper->map(Array, Object(OpenApi\Attributes\SecurityScheme))
#3 /data/www/hyperf-admin/vendor/tangwei/apidocs/src/Swagger/SwaggerOpenApi.php(104): Hyperf\DTO\Mapper::map(Array, Object(OpenApi\Attributes\SecurityScheme))
#4 /data/www/hyperf-admin/vendor/tangwei/apidocs/src/Swagger/SwaggerOpenApi.php(43): Hyperf\ApiDocs\Swagger\SwaggerOpenApi->setComponentsSecuritySchemes()
#5 /data/www/hyperf-admin/vendor/tangwei/apidocs/src/Listener/AfterDtoStartListener.php(52): Hyperf\ApiDocs\Swagger\SwaggerOpenApi->init()
#6 /data/www/hyperf-admin/vendor/hyperf/event/src/EventDispatcher.php(48): Hyperf\ApiDocs\Listener\AfterDtoStartListener->process(Object(Hyperf\DTO\Event\AfterDtoStart))
#7 /data/www/hyperf-admin/vendor/tangwei/dto/src/BeforeServerListener.php(63): Hyperf\Event\EventDispatcher->dispatch(Object(Hyperf\DTO\Event\AfterDtoStart))
#8 /data/www/hyperf-admin/vendor/hyperf/event/src/EventDispatcher.php(48): Hyperf\DTO\BeforeServerListener->process(Object(Hyperf\Framework\Event\BeforeServerStart))
#9 /data/www/hyperf-admin/vendor/hyperf/server/src/Server.php(131): Hyperf\Event\EventDispatcher->dispatch(Object(Hyperf\Framework\Event\BeforeServerStart))
#10 /data/www/hyperf-admin/vendor/hyperf/server/src/Server.php(72): Hyperf\Server\Server->initServers(Object(Hyperf\Server\ServerConfig))
#11 /data/www/hyperf-admin/vendor/hyperf/server/src/ServerFactory.php(56): Hyperf\Server\Server->init(Object(Hyperf\Server\ServerConfig))
#12 /data/www/hyperf-admin/vendor/hyperf/server/src/Command/StartServer.php(52): Hyperf\Server\ServerFactory->configure(Array)
#13 /data/www/hyperf-admin/vendor/symfony/console/Command/Command.php(298): Hyperf\Server\Command\StartServer->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#14 /data/www/hyperf-admin/vendor/symfony/console/Application.php(1042): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#15 /data/www/hyperf-admin/vendor/symfony/console/Application.php(299): Symfony\Component\Console\Application->doRunCommand(Object(Hyperf\Server\Command\StartServer), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#16 /data/www/hyperf-admin/vendor/symfony/console/Application.php(171): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#17 /data/www/hyperf-admin/bin/hyperf.php(23): Symfony\Component\Console\Application->run()
#18 /data/www/hyperf-admin/bin/hyperf.php(24): {closure}()
#19 /data/www/hyperf-admin/vendor/hyperf/watcher/watcher.php(22): require_once('/data/www/hyper...')
#20 {main}
thrown in /data/www/hyperf-admin/vendor/tangwei/dto/src/JsonMapper.php on line 177
Stop server success.
我希望实现Bearer格式的token
环境: swow-skeketon: 3.0
swow: 1.0
#[ApiOperation(summary: '查询')]
#[GetMapping(path: 'api')]
#[ApiHeader(name: 'test', required: true, type: 'string')]
#[ApiFormData(name: 'photo', required: true, type: 'file')]
public function api(#[RequestQuery] #[Valid] DemoRequest $request): DemoResponse
{
$response = new DemoResponse();
$response->setName('foo');
$response->setUser((new User())->setName('bar'));
$addressArr = [];
for ($i = 2; $i--;) {
$addressArr[] = (new Address())->setName('address');
}
$response->setAddressArr($addressArr);
return $response;
}
比如登录场景下,成功后只返回token,并不需要在DTO里定义,该如何写注解呢?谢谢
可否增加对数组字段的规则验证功能,如下验证field1 和field2
{
"info": [
{
"field1": 1,
"field2": "string"
},
{
"field1": 2,
"field2": "string2"
}
]
}
In Context.php line 129:
Version is only available reliably for validation and serialization
8.1 就多了个枚举, 可以使用了 PHP_VERSION_ID >= 80100 通过这个判断 来做相关逻辑啊
当前来说 8.0 基本都能用啊
PHP 版本: 8.2
hyperf版本: 3.0.45
swoole 版本: 5.0.3
api-docs版本:2.1.12
报错如下:
Narrowing occurred during type inference of ZEND_FETCH_DIM_W. Please file a bug report on https://github.com/php/php-src/issues in ./vendor/tangwei/apidocs/src/Swagger/SwaggerOpenApi.php
我看源码 注解dto是每次启动都会删除缓存重新生成 在phar包内是无法删除文件的 能否有一个配置 开启后则不清除缓存注解适合用于phar的模式
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.