Skip to content

Commit 5612b52

Browse files
committed
Add memoization for build referencable schemas
1 parent 394a324 commit 5612b52

File tree

3 files changed

+38
-1
lines changed

3 files changed

+38
-1
lines changed

src/Concerns/Referencable.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
trait Referencable
1616
{
17+
static $buildReferencableSchemas = [];
18+
1719
public static function ref(?string $objectId = null): Schema
1820
{
1921
$instance = app(static::class);
@@ -38,6 +40,6 @@ public static function ref(?string $objectId = null): Schema
3840
$baseRef = '#/components/securitySchemes/';
3941
}
4042

41-
return Schema::ref($baseRef.$instance->build()->objectId, $objectId);
43+
return self::$buildReferencableSchemas[static::class . "_{$objectId}"] ??= Schema::ref($baseRef.$instance->build()->objectId, $objectId);
4244
}
4345
}

tests/Fixtures/ExampleSchema.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace Vyuldashev\LaravelOpenApi\Tests\Fixtures;
4+
5+
use GoldSpecDigital\ObjectOrientedOAS\Contracts\SchemaContract;
6+
use GoldSpecDigital\ObjectOrientedOAS\Objects\Schema;
7+
use Vyuldashev\LaravelOpenApi\Contracts\Reusable;
8+
use Vyuldashev\LaravelOpenApi\Factories\SchemaFactory;
9+
10+
class ExampleSchema extends SchemaFactory implements Reusable
11+
{
12+
public function build(): SchemaContract
13+
{
14+
return Schema::object('ExampleSchema')
15+
->properties(
16+
Schema::string('example_string'),
17+
Schema::integer('example_integer'),
18+
Schema::boolean('example_boolean'),
19+
);
20+
}
21+
}

tests/MemoizationTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Vyuldashev\LaravelOpenApi\Tests;
4+
5+
use Vyuldashev\LaravelOpenApi\Tests\Fixtures\ExampleSchema;
6+
7+
class MemoizationTest extends TestCase
8+
{
9+
public function testReferencableInstanceBuildOnce(): void
10+
{
11+
self::assertEquals($e1ObjectId = (new ExampleSchema)::ref('e1'), (new ExampleSchema)::ref('e1'));
12+
self::assertNotEquals($e1ObjectId, (new ExampleSchema)::ref('e2'));
13+
}
14+
}

0 commit comments

Comments
 (0)