Maker Command
Use Symfony MakerBundle to scaffold DataTable classes from your Doctrine entities.
Requirements
symfony/maker-bundledoctrine/orm(DoctrineBundle)- A Doctrine entity class
Usage
-
Run the maker command
php bin/console make:datatable UserOr with a fully-qualified class name:
php bin/console make:datatable App\\Entity\\User -
Review the generated file
The command creates a class in
src/DataTables/:src/DataTables/UserDataTable.php -
Customize columns and options
Edit the generated class to adjust column types, titles, and table options.
Generated Code
The maker creates a class like this:
// src/DataTables/UserDataTable.php
namespace App\DataTables;
use App\Entity\User;
use Pentiminax\UX\DataTables\Attribute\AsDataTable;
use Pentiminax\UX\DataTables\Model\AbstractDataTable;
use Pentiminax\UX\DataTables\Column\TextColumn;
#[AsDataTable(User::class)]
final class UserDataTable extends AbstractDataTable
{
public function configureColumns(): iterable
{
yield TextColumn::new('id', 'Id');
yield TextColumn::new('email', 'Email');
yield TextColumn::new('firstName', 'First Name');
yield TextColumn::new('lastName', 'Last Name');
// Add more columns as needed
}
protected function mapRow(mixed $item): array
{
/** @var User $item */
return [
'id' => $item->getId(),
'email' => $item->getEmail(),
'firstName' => $item->getFirstName(),
'lastName' => $item->getLastName(),
];
}
}
What’s Included
The generated class includes:
| Element | Purpose |
|---|---|
| `#[AsDataTable(Entity::class)]` | Automatic Doctrine integration |
| `configureColumns()` | Starter column definitions |
| `mapRow()` | Row mapping skeleton for entity payload |
| Type hints and PHPDoc | Better IDE support and static analysis |
| Auto-detected column types | Maps `int/float` to `NumberColumn`, `bool` to `BooleanColumn`, and `DateTimeInterface` to `DateColumn` |
Customization Tips
After generation, you may want to:
Change Column Types
use Pentiminax\UX\DataTables\Column\NumberColumn;
use Pentiminax\UX\DataTables\Column\DateColumn;
public function configureColumns(): iterable
{
yield NumberColumn::new('id', 'ID'); // Instead of TextColumn
yield TextColumn::new('email', 'Email');
yield DateColumn::new('createdAt', 'Created'); // For dates
}
Add Column Configuration
yield TextColumn::new('email', 'Email')
->setOrderable(true)
->setSearchable(true)
->setWidth('200px');
Configure the DataTable
use Pentiminax\UX\DataTables\Model\DataTable;
public function configureDataTable(DataTable $table): DataTable
{
return $table
->pageLength(25)
->serverSide(true)
->processing(true);
}
Add Query Filters
use Doctrine\ORM\QueryBuilder;
use Pentiminax\UX\DataTables\DataTableRequest\DataTableRequest;
public function queryBuilderConfigurator(QueryBuilder $qb, DataTableRequest $request): QueryBuilder
{
return $qb
->andWhere('e.active = :active')
->setParameter('active', true);
}
Add Extensions
use Pentiminax\UX\DataTables\Enum\ButtonType;
use Pentiminax\UX\DataTables\Model\DataTableExtensions;
use Pentiminax\UX\DataTables\Model\Extensions\ButtonsExtension;
public function configureExtensions(DataTableExtensions $extensions): DataTableExtensions
{
return $extensions->addExtension(new ButtonsExtension([
ButtonType::CSV,
ButtonType::EXCEL,
ButtonType::PDF,
]));
}
Using the Generated Class
In your controller:
use App\DataTables\UserDataTable;
use Pentiminax\UX\DataTables\DataTableRequest\DataTableRequest;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class UserController extends AbstractController
{
#[Route('/users', name: 'app_users')]
public function index(UserDataTable $table, Request $request): Response
{
$table->handleRequest($request);
if ($table->isRequestHandled()) {
return $table->getResponse();
}
if (!$table->getDataTable()->isServerSide()) {
$table->fetchData(DataTableRequest::fromRequest($request));
}
return $this->render('user/index.html.twig', [
'table' => $table->getDataTable(),
]);
}
}
In Twig:
{% extends 'base.html.twig' %}
{% block body %}
<h1>Users</h1>
{{ render_datatable(table) }}
{% endblock %}
Command Options
# Basic usage
php bin/console make:datatable EntityName
# With namespace
php bin/console make:datatable App\\Entity\\User
# List available entities
php bin/console make:datatable
# (Will prompt for entity selection)