Démarrage rapide
Ce guide présente un exemple complet et fonctionnel : définir une entité User, écrire son mapper et effectuer des opérations de persistance de base avec EntityWorkspace.
Étape 1 — Définir l'entité
Une entité est une classe PHP simple. Elle n'importe rien de Weaver\ORM.
<?php
// src/Entity/User.php
declare(strict_types=1);
namespace App\Entity;
use DateTimeImmutable;
final class User
{
public function __construct(
public readonly ?int $id,
public readonly string $name,
public readonly string $email,
public readonly bool $isActive,
public readonly DateTimeImmutable $createdAt,
) {}
public function withEmail(string $email): self
{
return new self(
id: $this->id,
name: $this->name,
email: $email,
isActive: $this->isActive,
createdAt: $this->createdAt,
);
}
public function deactivate(): self
{
return new self(
id: $this->id,
name: $this->name,
email: $this->email,
isActive: false,
createdAt: $this->createdAt,
);
}
}
Remarque : pas de use Doctrine\..., pas d'attributs #[ORM\...], pas de classe de base. L'entité est un pur objet valeur PHP qui peut être testé unitairement sans démarrer Symfony ni se connecter à une base de données.
Étape 2 — Écrire le mapper
Le mapper est une classe séparée qui indique à Weaver comment User se mappe sur la table users. Il étend AbstractMapper et implémente quatre méthodes.
<?php
// src/Mapper/UserMapper.php
declare(strict_types=1);
namespace App\Mapper;
use App\Entity\User;
use DateTimeImmutable;
use Weaver\ORM\Mapping\AbstractMapper;
use Weaver\ORM\Mapping\ColumnDefinition;
use Weaver\ORM\Mapping\SchemaDefinition;
final class UserMapper extends AbstractMapper
{
public function table(): string
{
return 'users';
}
public function primaryKey(): string|array
{
return 'id';
}
public function schema(): SchemaDefinition
{
return SchemaDefinition::define(
ColumnDefinition::integer('id')->autoIncrement()->unsigned(),
ColumnDefinition::string('name', 120)->notNull(),
ColumnDefinition::string('email', 254)->unique()->notNull(),
ColumnDefinition::boolean('is_active')->notNull()->default(true),
ColumnDefinition::datetime('created_at')->notNull(),
);
}
public function hydrate(array $row): User
{
return new User(
id: (int) $row['id'],
name: $row['name'],
email: $row['email'],
isActive: (bool) $row['is_active'],
createdAt: new DateTimeImmutable($row['created_at']),
);
}
public function dehydrate(object $entity): array
{
/** @var User $entity */
$data = [
'name' => $entity->name,
'email' => $entity->email,
'is_active' => $entity->isActive,
'created_at' => $entity->createdAt->format('Y-m-d H:i:s'),
];
if ($entity->id !== null) {
$data['id'] = $entity->id;
}
return $data;
}
}
Les mappers qui étendent AbstractMapper sont auto-détectés et enregistrés par Weaver lorsque autoconfigure: true est activé dans config/services.yaml (la valeur par défaut de Symfony).
Étape 3 — Créer la table de base de données
docker compose exec app bin/console weaver:schema:create
Pour prévisualiser le SQL sans l'exécuter :
docker compose exec app bin/console weaver:schema:create --dump-sql