[English][Русский]
A library for creating Symfony forms using PHP attributes. Allows defining forms, their fields, transformers, and event listeners directly in DTO classes through attributes.
composer require kenny1911/symfony-attribute-form<?php
declare(strict_types=1);
use Kenny1911\SymfonyAttributeForm\EventListener;
use Kenny1911\SymfonyAttributeForm\Field;
use Kenny1911\SymfonyAttributeForm\Form;
use Kenny1911\SymfonyAttributeForm\ModelTransformer;
use Kenny1911\SymfonyAttributeForm\ViewTransformer;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormEvents;
#[Form(name: 'create-post', options: ['action' => '/posts/new'])]
#[ModelTransformer(new NothingDataTransformer())]
#[ViewTransformer(new NothingDataTransformer())]
#[EventListener(eventName: FormEvents::PRE_SUBMIT, listener: [self::class, 'preSubmitForm'], priority: 5)]
final class CreatePost
{
public function __construct(
#[Field(label: 'Post title', options: ['attr' => ['class' => 'input']])]
public ?string $title = null,
#[Field(type: TextareaType::class, label: 'Post description', required: true, options: ['attr' => ['class' => 'textarea']])]
#[ModelTransformer(new NothingDataTransformer())]
#[ViewTransformer(new NothingDataTransformer())]
#[EventListener(eventName: FormEvents::PRE_SET_DATA, listener: [self::class, 'preSetDescriptionData'], priority: 7)]
public ?string $description = null,
#[Field(type: DateTimeType::class, label: 'Published date', required: false, options: ['attr' => ['class' => 'input']])]
public ?\DateTimeImmutable $published = null,
) {}
public static function preSubmitForm(): void
{
// Code for PRE_SUBMIT event handling
}
public static function preSetDescriptionData(): void
{
// Code for PRE_SET_DATA event handling for description field
}
}$form = $this->attributeFormFactory->createFormBuilder(CreatePost::class);# config/services.yaml
services:
Kenny1911\SymfonyAttributeForm\AttributeFormFactory:
arguments:
- '@form.factory'Defines the main form:
name- form nameoptions- form options
Defines a form field. Can be applied to class properties:
type- field type (default:TextType)label- field labelrequired- required field (default:true)options- additional field options
Add data transformers to form or field.
Adds event listener to form or field:
eventName- event namelistener- callable listenerpriority- priority
- PHP 8.1+
- Symfony Form 6.4+
MIT