Bundle Symfony 7 & 8 permettant de générer automatiquement des fichiers de définitions TypeScript (.ts) à partir du Symfony Serializer, des Custom Normalizers, des groupes de sérialisation et de JMS Serializer.
- Multi-Projets & Multi-Répertoires : Configurez plusieurs projets cibles avec des dossiers de sortie distants (ex:
assets/ts/types,public/ts/types). - Filtrage par Groupes de Sérialisation : Génération exacte des propriétés exposées par vos attributs
#[Groups(['user:read'])]. - Formats d'Export Configurables : Choisissez de générer des
interface(par défaut), desclassou destypeTypeScript via l'optionkind. - Modes d'Extraction Flexibles (
mode) :runtime: Exécute la véritable chaîne de normalisation ($serializer->normalize()) pour capturer le résultat exact des Custom Normalizers, desNameConverteret des accesseurs dynamiques / getters calculés.static: Analyse statique viaClassMetadataFactoryet la réflexion PHP.jms: Support des métadonnéesJMS\Serializer.auto(par défaut) : Teste d'abord le moderuntime, puis bascule automatiquement enstatic/jmsen cas de fallback.
- Support des Relations Doctrine ORM :
- Interprétation automatique des relations
OneToManyetManyToManyenArray<Target>. - Interprétation des
ManyToOneetOneToOneenTarget | null. - Détection du typage générique PHPDoc
@var Collection<int, Target>ou@var Target[].
- Interprétation automatique des relations
- Dépendances & Imports Automatiques :
- Génération d'imports relatifs (
import { Role } from './Role';). - Option
auto_generate_deps: truepour découvrir et générer automatiquement toutes les entités référencées.
- Génération d'imports relatifs (
Installez le bundle via Composer :
composer require codifyo/ts-generator-bundleSi Symfony Flex n'enregistre pas le bundle automatiquement, ajoutez-le dans config/bundles.php :
return [
// ...
Codifyo\TsGeneratorBundle\CodifyoTsGeneratorBundle::class => ['all' => true],
];Créez le fichier de configuration config/packages/codifyo_ts_generator.yaml :
codifyo_ts_generator:
projects:
frontend:
dir: 'assets/ts/types'
mode: 'auto' # 'auto' | 'runtime' | 'static' | 'jms' (optionnel, défaut: 'auto')
types:
- class: 'App\Entity\User'
groups: ['user:read']
kind: 'interface' # 'interface' | 'class' | 'type' (optionnel, défaut: 'interface')
auto_generate_deps: true # Découvre et génère automatiquement les entités liées (ex: Role)
- class: 'App\Entity\Product'
groups: ['product:read', 'product:detail']
name: 'ProductDTO' # Nom du type TS personnalisé (optionnel)
mode: 'runtime' # Surchargé spécifiquement pour ce typeExécutez la commande console Symfony pour générer les fichiers TypeScript :
# Générer tous les projets configurés
php bin/console codifyo:ts-generator:generate
# Générer uniquement un projet spécifique
php bin/console codifyo:ts-generator:generate --project=frontend
# ou version courte
php bin/console codifyo:ts-generator:generate -p frontendnamespace App\Entity;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Serializer\Annotation\Groups;
class User
{
#[Groups(['user:read'])]
private int $id;
#[Groups(['user:read'])]
private string $username;
#[Groups(['user:read'])]
private ?string $email = null;
/**
* @var Collection<int, Role>
*/
#[Groups(['user:read'])]
private Collection $roles;
#[Groups(['user:read'])]
public function getFullName(): string
{
return $this->firstName . ' ' . $this->lastName;
}
}/* tslint:disable */
/* eslint-disable */
// Auto-generated by CodifyoTsGeneratorBundle. Do not edit manually.
import { Role } from './Role';
export interface User {
id: number;
username: string;
email?: string | null;
roles: Array<Role>;
fullName: string;
}Pour exécuter la suite de tests unitaires et d'intégration PHPUnit :
vendor/bin/phpunitCe bundle est distribué sous la licence MIT.