Initial commit
This commit is contained in:
118
skills/make-out/README.md
Normal file
118
skills/make-out/README.md
Normal 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
112
skills/make-out/SKILL.md
Normal 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)
|
||||
Reference in New Issue
Block a user