
PHP od wersji 8.0 posiada natywne atrybuty (attributes). Aby w prosty sposób zamienić w całej aplikacji annotacje na atrybuty możemy posłużyć się narzędziem Rector .
Gdzie możemy używać atrybutów zamiast adnotacji?
- Mapowanie encji doctrine
 - Mapowanie routingu
 - Wszystkie customowe adnotacje, które napisaliśmy
 - Konfiguracja validatora
 
Czego będziemy potrzebować?
- Rector
 
Aby zainstalować rectora w konsoli należy wpisać:
composer require rector/rector --dev
- Doctrine w wersji 
>=2.9 
Po instalacji rectora oraz upewnieniu się, że posiadamy doctrine w wersji >=2.9 zainicjujmy rectora używając komendy:
vendor/bin/rector init
W głównym katalogu powinien pojawić się plik konfiguracyjny rector.php.
Poniżej przedstawiam konfigurację aby zamienić adnotacje na atrybuty dla aplikacji napisanej w Symfony.
<?php
declare(strict_types=1);
use Rector\CodingStyle\Rector\Use_\RemoveUnusedAliasRector;
use Rector\Core\Configuration\Option;
use Rector\Doctrine\Set\DoctrineSetList;
use Rector\Symfony\Set\SymfonySetList;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
    $parameters = $containerConfigurator->parameters();
    $parameters->set(Option::AUTO_IMPORT_NAMES, true);
    $parameters->set(Option::IMPORT_SHORT_CLASSES, true);
    $containerConfigurator->import(DoctrineSetList::ANNOTATIONS_TO_ATTRIBUTES);
    $containerConfigurator->import(SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES);
    $containerConfigurator->import(SymfonySetList::SYMFONY_CODE_QUALITY);
    $containerConfigurator->import(SymfonySetList::SYMFONY_CONSTRUCTOR_INJECTION);
    $services = $containerConfigurator->services();
    $services->set(RemoveUnusedAliasRector::class);
};
Następnie możemy sprawdzić jakie zmiany rector wprowadzi w plikach
vendor/bin/rector process src --dry-run
Gdy nie zauważmy nic niepokojącego wystarczy użyć powyższą komendę bez --dry-run
vendor/bin/rector process src
Na koniec musimy zmienić plik konfiguracyjny doctrine.yaml szukamy w nim parametr odpowiedzialny za typ mapowania, znajduje się on w doctrine.orm.mappings.{namespace[domyślnie App]}.type i zamieniamy annotation na attribute.
To wszystko, na koniec jeśli nie potrzebujemy rectora wystarczy go usunać:
composer remove rector/rector --dev
Po czym usuwamy plik rector.php.
Bardzo fajny wpis, widziałem ostatnio podobne artykuły i ten się wyróżnia na tle innych oraz jest wart uwagi. Konkretnie objaśniony temat. Bardzo przyjemnie się go czyta. Czekam na takich więcej 🙂