Maker Command
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
Terminal window php bin/console make:datatable UserOr with a fully-qualified class name:
Terminal window 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:
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:
#[AsDataTable(Entity::class)]attribute for automatic Doctrine integrationconfigureColumns()method with starter columnsmapRow()method skeleton for entity mapping- Type hints and PHPDoc annotations
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\Model\Extensions\ButtonsExtension;use Pentiminax\UX\DataTables\Enum\ButtonType;
public function configureButtonsExtension(ButtonsExtension $ext): ButtonsExtension{ return $ext->buttons([ 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 usagephp bin/console make:datatable EntityName
# With namespacephp bin/console make:datatable App\\Entity\\User
# List available entitiesphp bin/console make:datatable# (Will prompt for entity selection)