I am using swagger to create an OpenApi documentation. I am switching now to php attributes and phpstan in level 6 complain about missing specific array declaration, which worked totally fine as long as I was using annotations.
I give you an example:
<?php
declare(strict_types=1);
namespace App\Api\Dto;
use OpenApi\Attributes as OA;
#[OA\Schema()]
class UserDto implements DtoInterface
{
#[OA\Property(description: 'Personalnummer ', type: 'string')]
public ?string $uid = null;
#[OA\Property(description: 'Name,Vorname', type: 'string')]
public ?string $username = null;
#[OA\Property(description: 'Stammhaus', type: 'string')]
public ?string $mainhouse = null;
#[OA\Property(description: 'Name, Vorname', type: 'integer')]
public ?int $companyId = null;
#[OA\Property(description: 'Symfony Rollen in der Applikation', type: 'array')]
/** @var array<string> */
public array $roles = [];
#[OA\Property(description: 'Rechte', type: 'array', items: new OA\Items(type: 'string'))]
/** @var array<string> */
public array $grants = [];
#[OA\Property(description: 'Ressourcen', type: 'array')]
/** @var array<string, array<string>> */
public array $resources = [];
}
This results on phpstan analyse level 6 in the following errors:
------ ---------------------------------------------------------------------------------------------------
Line Api/Dto/UserDto.php
------ ---------------------------------------------------------------------------------------------------
26 Property App\Api\Dto\UserDto::$roles type has no value type specified in iterable type array.
💡 See: https://phpstan.org/blog/solving-phpstan-no-value-type-specified-in-iterable-type
29 Property App\Api\Dto\UserDto::$grants type has no value type specified in iterable type array.
💡 See: https://phpstan.org/blog/solving-phpstan-no-value-type-specified-in-iterable-type
33 Property App\Api\Dto\UserDto::$resources type has no value type specified in iterable type array.
💡 See: https://phpstan.org/blog/solving-phpstan-no-value-type-specified-in-iterable-type
------ ---------------------------------------------------------------------------------------------------
The lines mentioned being the array definitions.
Of course I can always switch down to level 5, but this feels like giving up. What would be the proper array annotation to make phpstan pass?
php8.2 nelmio/api-doc-bundle:4.28 phpstan:1.11 phpstan/phpdoc-parser:1.29
You need to write properties like this:
/** @var array<string> */
#[OA\Property(description: 'Rechte', type: 'array', items: new OA\Items(type: 'string'))]
public array $grants = [];
This is a known limitation of nikic/PHP-Parser: https://github.com/nikic/PHP-Parser/issues/762 It does not see PHPDocs between attributes and properties.