Skip to content

Commit 7070255

Browse files
authored
[php-flight] fix: parsing class/enum models (#18528)
1 parent 06ed7c8 commit 7070255

File tree

4 files changed

+61
-7
lines changed

4 files changed

+61
-7
lines changed

modules/openapi-generator/src/main/resources/php-flight/register_routes.mustache

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,10 @@ function parseParam(mixed $param, string $type)
7373
} elseif (str_ends_with($type, '[]')) {
7474
return array_map(fn($el) => parseParam($el, substr($type, 0, -2)), $param);
7575
} elseif (str_starts_with($nonNullType, '\\{{escapedModelPackage}}')) {
76-
return new $nonNullType($param);
76+
if (enum_exists($nonNullType)) {
77+
return $nonNullType::tryFrom($param);
78+
}
79+
return $nonNullType::fromArray($param);
7780
} else {
7881
return $param;
7982
}
@@ -82,4 +85,4 @@ function parseParam(mixed $param, string $type)
8285
function declaresMethod(\ReflectionClass $reflectionClass, string $methodName): bool
8386
{
8487
return $reflectionClass->hasMethod($methodName) && $reflectionClass->getMethod($methodName)->getDeclaringClass()->getName() === $reflectionClass->getName();
85-
}
88+
}

modules/openapi-generator/src/main/resources/php-flight/register_routes_test.mustache

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
{{#apiInfo}}
66
namespace {{testPackage}};
77

8+
use function {{invokerPackage}}\parseParam;
9+
810
class RegisterRoutesTest extends \PHPUnit\Framework\TestCase {
911
{{#apis}}
1012
public function testRegisterRoutes{{classname}}(): void
@@ -27,5 +29,25 @@ class RegisterRoutesTest extends \PHPUnit\Framework\TestCase {
2729
$this->assertTrue(true);
2830
}
2931
{{/apis}}
32+
{{#models}}
33+
{{#model}}
34+
{{#isEnum}}
35+
public function testParseParamsEnum{{classname}}(): void
36+
{
37+
{{#allowableValues}}
38+
{{#enumVars}}
39+
{{#-first}}
40+
$value = {{{value}}};
41+
{{/-first}}
42+
{{/enumVars}}
43+
{{/allowableValues}}
44+
$this->assertEquals(
45+
parseParam($value, '\\{{escapedModelPackage}}\\{{classname}}'),
46+
\{{modelPackage}}\{{classname}}::{{#allowableValues}}{{#enumVars}}{{#-first}}{{{name}}}{{/-first}}{{/enumVars}}{{/allowableValues}}
47+
);
48+
}
49+
{{/isEnum}}
50+
{{/model}}
51+
{{/models}}
3052
}
3153
{{/apiInfo}}

samples/server/petstore/php-flight/RegisterRoutes.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ static public function registerRoutes(\OpenAPIServer\Api\AbstractPetApi|\OpenAPI
4747
\Flight::route('DELETE /pet/@petId', function (string $petId) use ($handler) {
4848
$r = \Flight::request();
4949
$handler->deletePet(
50-
parseParam($petId, 'int'),
50+
parseParam($petId, 'int'),
5151
parseParam($r->getHeader('api_key'), '?string')
5252
);
5353
\Flight::halt(204);
@@ -313,7 +313,7 @@ static public function registerRoutes(\OpenAPIServer\Api\AbstractPetApi|\OpenAPI
313313
\Flight::route('GET /user/login', function () use ($handler) {
314314
$r = \Flight::request();
315315
$result = $handler->loginUser(
316-
parseParam($r->query['username'] ?? null, 'string'),
316+
parseParam($r->query['username'] ?? null, 'string'),
317317
parseParam($r->query['password'] ?? null, 'string')
318318
);
319319
if ($result === null) {
@@ -343,7 +343,7 @@ static public function registerRoutes(\OpenAPIServer\Api\AbstractPetApi|\OpenAPI
343343
\Flight::route('PUT /user/@username', function (string $username) use ($handler) {
344344
$r = \Flight::request();
345345
$handler->updateUser(
346-
parseParam($username, 'string'),
346+
parseParam($username, 'string'),
347347
parseParam(json_decode($r->getBody(), true), '\\OpenAPIServer\\Model\\User')
348348
);
349349
\Flight::halt(204);
@@ -368,7 +368,10 @@ function parseParam(mixed $param, string $type)
368368
} elseif (str_ends_with($type, '[]')) {
369369
return array_map(fn($el) => parseParam($el, substr($type, 0, -2)), $param);
370370
} elseif (str_starts_with($nonNullType, '\\OpenAPIServer\\Model')) {
371-
return new $nonNullType($param);
371+
if (enum_exists($nonNullType)) {
372+
return $nonNullType::tryFrom($param);
373+
}
374+
return $nonNullType::fromArray($param);
372375
} else {
373376
return $param;
374377
}
@@ -377,4 +380,4 @@ function parseParam(mixed $param, string $type)
377380
function declaresMethod(\ReflectionClass $reflectionClass, string $methodName): bool
378381
{
379382
return $reflectionClass->hasMethod($methodName) && $reflectionClass->getMethod($methodName)->getDeclaringClass()->getName() === $reflectionClass->getName();
380-
}
383+
}

samples/server/petstore/php-flight/Test/RegisterRoutesTest.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
namespace OpenAPIServer\Test;
1919

20+
use function OpenAPIServer\parseParam;
21+
2022
class RegisterRoutesTest extends \PHPUnit\Framework\TestCase {
2123
public function testRegisterRoutesAbstractPetApi(): void
2224
{
@@ -49,4 +51,28 @@ public function createUser(\OpenAPIServer\Model\User $user): void
4951
\OpenAPIServer\RegisterRoutes::registerRoutes($handler);
5052
$this->assertTrue(true);
5153
}
54+
public function testParseParamsEnumFindPetsByStatusStatusParameterInner(): void
55+
{
56+
$value = 'available';
57+
$this->assertEquals(
58+
parseParam($value, '\\OpenAPIServer\\Model\\FindPetsByStatusStatusParameterInner'),
59+
\OpenAPIServer\Model\FindPetsByStatusStatusParameterInner::AVAILABLE
60+
);
61+
}
62+
public function testParseParamsEnumOrderStatus(): void
63+
{
64+
$value = 'placed';
65+
$this->assertEquals(
66+
parseParam($value, '\\OpenAPIServer\\Model\\OrderStatus'),
67+
\OpenAPIServer\Model\OrderStatus::PLACED
68+
);
69+
}
70+
public function testParseParamsEnumPetStatus(): void
71+
{
72+
$value = 'available';
73+
$this->assertEquals(
74+
parseParam($value, '\\OpenAPIServer\\Model\\PetStatus'),
75+
\OpenAPIServer\Model\PetStatus::AVAILABLE
76+
);
77+
}
5278
}

0 commit comments

Comments
 (0)