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 🙂