Maker Command

Use Symfony MakerBundle to scaffold DataTable classes from your Doctrine entities.

Requirements

  • symfony/maker-bundle
  • doctrine/orm (DoctrineBundle)
  • A Doctrine entity class

Usage

  1. Run the maker command

    php bin/console make:datatable User

    Or with a fully-qualified class name:

    php bin/console make:datatable App\\Entity\\User
  2. Review the generated file

    The command creates a class in src/DataTables/:

    src/DataTables/UserDataTable.php
  3. 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 PHPDocBetter IDE support and static analysis
Auto-detected column typesMaps `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)