Initial commit

This commit is contained in:
Zhongwei Li
2025-11-29 17:58:52 +08:00
commit eac17f89fa
40 changed files with 4048 additions and 0 deletions

118
skills/make-out/README.md Normal file
View File

@@ -0,0 +1,118 @@
# Framework Make Out
Génère une classe Out (DTO immuable pour output).
## Vue d'ensemble
Cette skill crée une classe Out qui sert de Data Transfer Object immuable pour exposer les données d'une entité vers l'extérieur.
## Caractéristiques
### Classe Out générée
- Classe `final readonly` (PHP 8.2+)
- Constructeur privé
- Factory statique `new()`
- Encapsule l'entité
- Complètement immuable
- Couche anti-corruption
## Utilisation
```bash
Use skill framework:make:out
```
Vous serez invité à fournir le nom de l'entité.
## Exemple d'utilisation
```bash
EntityName: Product
```
Génère :
```php
// src/Out/ProductOut.php
final readonly class ProductOut
{
private function __construct(
private Product $product,
) {}
public static function new(Product $product): self
{
return new self(product: $product);
}
}
```
## Structure créée
```
src/
└── Out/
└── {EntityName}Out.php
```
## Prérequis
- L'entité doit exister dans `src/Entity/{EntityName}.php`
- PHP 8.2+ pour readonly classes
## Usage recommandé
### Dans l'entité
```php
final class Product implements OutInterface
{
public function out(): ProductOut
{
return ProductOut::new(product: $this);
}
}
```
### Dans un contrôleur
```php
#[Route('/api/products/{id}', methods: ['GET'])]
public function show(Product $product): JsonResponse
{
return $this->json($product->out());
}
```
### Ajout de méthodes exposées
```php
final readonly class ProductOut
{
private function __construct(
private Product $product,
) {}
public static function new(Product $product): self
{
return new self(product: $product);
}
public function id(): string
{
return $this->product->id()->toRfc4122();
}
public function name(): string
{
return $this->product->name();
}
public function formattedPrice(): string
{
return number_format($this->product->price(), 2) . ' €';
}
}
```
## Principes Elegant Objects appliqués
- Classe finale
- Constructeur privé
- Factory statique
- Immutabilité totale (readonly)
- Encapsulation de l'entité
- Pas de getters bruts, méthodes métier

112
skills/make-out/SKILL.md Normal file
View File

@@ -0,0 +1,112 @@
---
name: framework:make:out
description: Génère classe Out (DTO immuable pour output)
license: MIT
version: 1.0.0
---
# Framework Make Out Skill
## Description
Génère une classe Out (Data Transfer Object) immuable pour représenter les données de sortie d'une entité.
La classe Out est un DTO readonly qui encapsule une entité pour l'exposition vers l'extérieur (API, vues, etc.).
## Usage
```
Use skill framework:make:out
Vous serez invité à fournir :
- Le nom de l'entité (ex: Product, User, Order)
```
## Templates
- `Out/UtilisateurOut.php` - Template de classe Out
## Variables requises
- **{EntityName}** - Nom de l'entité en PascalCase (ex: Utilisateur, Product)
- **{entityName}** - Nom de l'entité en camelCase (ex: utilisateur, product)
- **{namespace}** - Namespace du projet (défaut: App)
## Dépendances
- Requiert que l'entité existe dans `src/Entity/{EntityName}.php`
## Outputs
- `src/Out/{EntityName}Out.php`
## Workflow
1. Demander le nom de l'entité (EntityName)
2. Vérifier que l'entité existe dans `src/Entity/{EntityName}.php`
- Si non : arrêter et demander de créer l'entité d'abord
3. Générer la classe Out depuis le template :
- Remplacer `{EntityName}` par le nom fourni
- Remplacer `{entityName}` par la version camelCase
4. Afficher le fichier créé
## Patterns appliqués
### Classe Out
- Classe `final readonly`
- Constructeur privé
- Factory statique `new()` pour instanciation
- Propriété privée de type entité
- Objet complètement immuable
## Exemple
```bash
Use skill framework:make:out
# Saisies utilisateur :
EntityName: Product
# Résultat :
✓ src/Out/ProductOut.php
```
Fichier généré :
```php
<?php
declare(strict_types=1);
namespace App\Out;
use App\Entity\Product;
final readonly class ProductOut
{
private function __construct(
private Product $product,
) {
}
public static function new(
Product $product,
): self {
return new self(
product: $product,
);
}
}
```
## Usage dans l'entité
L'entité doit implémenter la méthode `out()` :
```php
public function out(): ProductOut
{
return ProductOut::new(
product: $this,
);
}
```
## Notes
- La classe Out peut être enrichie avec des méthodes pour exposer des propriétés calculées
- Elle sert de couche anti-corruption entre le domaine et l'extérieur
- Permet de contrôler finement ce qui est exposé depuis l'entité
- Respecte le principe d'immutabilité (readonly)