Skill custom-validator
Créez des contraintes de validation personnalisées pour les ressources API Platform en utilisant les contraintes Symfony ou les règles de validation Laravel.
- Étoiles GitHub
- 29
- Fichiers
- 1
- Dernier commit
- 22 oct. 2026
- Licence
- —
- Outils autorisés
- —
Que fait la skill custom-validator ?
custom-validator est une agent skill. Créez des contraintes de validation personnalisées pour les ressources API Platform en utilisant les contraintes Symfony ou les règles de validation Laravel.
Résumé généré à partir du SKILL.md de la skill.
À propos du skill custom-validator
Cette SKILL permet aux développeurs backend de développer une logique métier complexe pour les ressources API Platform. Elle fournit les modèles nécessaires pour implémenter des contraintes de validation personnalisées lorsque les règles standard de Symfony ou Laravel sont insuffisantes pour répondre à des exigences spécifiques. Un agent doit charger cette SKILL lorsqu'un utilisateur doit imposer des formats spécifiques au domaine, vérifier l'unicité ou implémenter des limites de débit et de forfait lors des opérations d'écriture.
Pour les projets basés sur Symfony, la SKILL démontre comment créer une classe Constraint et une classe ConstraintValidator correspondante pour gérer des logiques telles que la vérification des limites de compte. Elle couvre également les contraintes au niveau de la classe pour la validation multi-champs et la validation par callback pour les DTO. Pour les environnements Laravel, elle se concentre sur l'utilisation de l'option rules au sein de l'attribut ApiResource, prenant en charge les tableaux, les closures ou les chaînes de caractères de classe FormRequest. Cela garantit que les règles métier personnalisées émettent correctement des réponses 422 ConstraintViolationList.
Ce qu'un agent peut faire avec
- 1Appliquer des limites de compte basées sur le forfaitCréez un validateur qui empêche les utilisateurs de dépasser un nombre spécifique de comptes en fonction de leur forfait d'abonnement actuel.
Rédigé à partir du SKILL.md du skill. Chaque cas d'utilisation est vérifié par rapport à une citation de celui-ci.
Comment installer la skill custom-validator
Chaque commande copie le dossier de la skill dans le répertoire des skills du client. Redémarrez le client ou démarrez une nouvelle session pour la charger.Installer la skill custom-validator dans Plugin
/plugin marketplace add api-platform/skillset /plugin install api-platform@api-platform-skillset
Installer la skill custom-validator dans Claude Code
~/.claude/skills/custom-validator/SKILL.md
$ npx degit api-platform/skillset/skills/custom-validator ~/.claude/skills/custom-validatorInstaller la skill custom-validator dans Claude Code (project)
.claude/skills/custom-validator/SKILL.md
$ npx degit api-platform/skillset/skills/custom-validator .claude/skills/custom-validatorInstaller la skill custom-validator dans Codex
~/.agents/skills/custom-validator/SKILL.md
$ npx degit api-platform/skillset/skills/custom-validator ~/.agents/skills/custom-validatorInstaller la skill custom-validator dans Gemini CLI
~/.gemini/skills/custom-validator/SKILL.md
$ npx degit api-platform/skillset/skills/custom-validator ~/.gemini/skills/custom-validatorInstaller la skill custom-validator dans Claude.ai
npx degit api-platform/skillset/skills/custom-validator custom-validator && zip -r custom-validator.zip custom-validator # claude.ai → Customize → Skills → + → Create skill → Upload a skill → custom-validator.zip
SKILL.md
Voir sur GitHubCustom Validation Constraints
Create custom validators when built-in Symfony constraints are insufficient.
Constraint Class
<?php
namespace App\Validator;
use Symfony\Component\Validator\Constraint;
#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
class IsValidAccountLimit extends Constraint
{
public string $message = 'Account limit reached for your current plan.';
public int $limit = 50;
}
Validator Class
Convention: {ConstraintName}Validator in the same namespace.
<?php
namespace App\Validator;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class IsValidAccountLimitValidator extends ConstraintValidator
{
public function __construct(
private readonly UserHelper $userHelper,
private readonly AccountRepository $accountRepository,
) {}
public function validate(mixed $value, Constraint $constraint): void
{
if (!$constraint instanceof IsValidAccountLimit) {
throw new \InvalidArgumentException('Unexpected constraint type');
}
if (null === $value || '' === $value) {
return;
}
$user = $this->userHelper->getUser();
$count = $this->accountRepository->countByUser($user->getId());
if ($count >= $constraint->limit) {
$this->context->buildViolation($constraint->message)
->addViolation();
}
}
}
Usage on Properties
use App\Validator\IsValidAccountLimit;
use Symfony\Component\Validator\Constraints as Assert;
class Account
{
#[Assert\NotBlank(groups: ['account:write'])]
#[Assert\Email(groups: ['account:write'])]
#[IsValidAccountLimit(groups: ['account:write'])]
public ?string $address;
}
Class-Level Constraint (UniqueEntity)
For constraints that validate across multiple fields:
#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::IS_REPEATABLE)]
class MongoDBUnique extends Constraint
{
public array $fields = [];
public string $message = 'This value is already used.';
public function getTargets(): string
{
return self::CLASS_CONSTRAINT;
}
}
Usage:
#[MongoDBUnique(fields: ['address'], groups: ['account:write', 'account:patch'])]
class Account {}
Validation Groups with Operations
Target a constraint to specific operations by passing groups: (as shown above)
and wiring those groups into each operation's validationContext — see
operations for the full per-operation setup.
Callback Validation
For quick one-off validation on DTOs:
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class SendMessage
{
public ?string $text = null;
public ?string $html = null;
#[Assert\Callback]
public function validateContent(ExecutionContextInterface $context): void
{
if (null === $this->text && null === $this->html) {
$context->buildViolation('Either text or html content is required.')
->atPath('text')
->addViolation();
}
}
}
Laravel
Laravel does not use Symfony Constraints/ConstraintValidator. Validation is
declared with Laravel validation rules via the
rules option on #[ApiResource] or per-operation (rules can be an array, a closure,
or a FormRequest class-string). The ValidateProvider runs them before the
processor and emits the same 422 ConstraintViolationList shape.
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Post;
#[ApiResource(rules: ['title' => 'required|min:2'])]
#[Post(rules: ['isbn' => ['required', 'string']])] // per-operation override
class Book extends Model {}
For business rules beyond built-in rules, write a Laravel custom rule (a class
implementing Illuminate\Contracts\Validation\ValidationRule, scaffold with
php artisan make:rule) or a closure rule, and reference it in rules. A
FormRequest class-string is also accepted — its authorize()/rules() run, and an
AuthorizationException maps to 403, ValidationException to 422. Validation groups
and Symfony validationContext do not apply on Laravel; scope rules per operation
instead. Partial PATCH can relax required to sometimes via
partial_patch_validation in config/api-platform.php.
Fichiers de cette skill
1Questions sur la skill custom-validator
Comment installer la skill custom-validator dans Claude Code ?
Exécutez npx degit api-platform/skillset/skills/custom-validator ~/.claude/skills/custom-validator. Claude Code charge les skills depuis ~/.claude/skills (tous les projets) ou .claude/skills (un seul projet) et utilise une skill lorsque sa description correspond à la tâche.
Quels clients peuvent utiliser la skill custom-validator ?
Tout client qui lit le format Agent Skills : Claude Code, Codex, Gemini CLI et claude.ai (envoi sous forme de ZIP). Les scripts de la skill ne s'exécutent que si le client autorise l'exécution de code.
Comment créer un validateur personnalisé dans Symfony pour API Platform ?
Vous devez créer une classe Constraint et une classe Validator correspondante en suivant la convention de nommage {ConstraintName}Validator dans le même namespace.