La DataTable v1.0.2 est désormais pleinement fonctionnelle :
Validation systématique :
make phpstan
make lint
make tests
Supprimer le dernier couplage fort de la DataTable aux données fournies via :
'rows' => [...]
Introduire une abstraction de source de données afin de permettre :
'source' => User::class
tout en conservant une compatibilité complète avec :
'rows' => [...]
Un environnement de test est présent dans le dossier demo.
Il s'agit d'une installation Symfony minimale utilisée uniquement pour valider les composants.
Tout ce qui ne concerne pas directement le composant doit se trouver dans demo :
Il existe un HomeController qui renvoie la page de démonstration.
La validation visuelle devra être effectuée uniquement via :
demo/templates/demo/index.html.twig
Aucun élément spécifique à la démonstration ne doit être ajouté dans le package principal.
La DataTable ne doit jamais dépendre directement de Doctrine.
L'objectif est d'introduire un mécanisme extensible permettant de supporter plusieurs sources de données sans modifier le composant principal.
Architecture cible :
DataTable
│
▼
DataSourceResolver
│
▼
DataSourceInterface
├── ArrayDataSource
├── DoctrineDataSource
└── FutureDataSources
Le composant DataTable ne doit contenir :
EntityManagerInterfaceRepositoryQueryBuilderLe support Doctrine doit être isolé dans une datasource dédiée.
Créer une interface :
interface DataSourceInterface
{
public function supports(mixed $source): bool;
public function fetch(
mixed $source,
DataTableState $state
): DataTableResult;
}
Créer un resolver chargé de déterminer automatiquement la datasource adaptée.
final class DataSourceResolver
{
public function resolve(mixed $source): DataSourceInterface;
}
Première implémentation.
Cette datasource permet de conserver le fonctionnement actuel.
Exemples :
[
'source' => [
[
'name' => 'Admin',
'email' => 'admin@example.test',
],
],
]
ou
[
'rows' => [...],
]
Responsabilités :
DataTableResultLe fonctionnement actuel doit rester totalement opérationnel.
Les configurations existantes :
[
'rows' => [...],
]
ne doivent pas être cassées.
rows doit être considéré comme un alias de compatibilité de :
[
'source' => [...]
]
Une phase de transition doit être prévue.
Le composant doit continuer à accepter les deux syntaxes.
Deuxième implémentation.
Permet de fournir directement une entité Doctrine.
Exemple :
[
'source' => User::class,
]
Responsabilités :
DataTableResultLorsque la source est une entité Doctrine :
[
'source' => User::class,
]
les colonnes doivent correspondre à des propriétés réellement disponibles sur l'entité.
Si une colonne ne peut pas être résolue, une erreur explicite doit être levée.
Exemple :
Column "status" cannot be mapped on entity App\Entity\User.
Use a computed column/value callback or expose a real property.
L'objectif est d'éviter les erreurs silencieuses et de faciliter le débogage.
Ne pas implémenter dans cette tâche :
Ces sujets seront traités dans des tâches ultérieures.
Une fois cette abstraction en place, il sera possible d'ajouter facilement :
ApiDataSource
ElasticDataSource
CsvDataSource
CustomDataSource
sans modifier le composant DataTable.
Tous les contrôles qualité doivent rester verts :
make tests
make phpstan
make lint-twig
make npm-build
rowssourcerowsCette tâche n'a pas pour objectif d'ajouter une fonctionnalité visible.
Son objectif est de supprimer le dernier couplage fort du composant DataTable afin de garantir son extensibilité future tout en conservant sa philosophie actuelle :
Cette abstraction constitue la fondation permettant d'introduire ultérieurement de nouvelles sources de données sans modifier le cœur du composant.
How can I help you explore Laravel packages today?