Recipe: Doctrine Server-Side

What / When

Use this recipe for entity-backed tables where search, order, and paging must run in Doctrine.

Minimal Example

use App\Entity\User;
use Pentiminax\UX\DataTables\Attribute\AsDataTable;
use Pentiminax\UX\DataTables\Column\NumberColumn;
use Pentiminax\UX\DataTables\Column\TextColumn;
use Pentiminax\UX\DataTables\Model\AbstractDataTable;
use Pentiminax\UX\DataTables\Model\DataTable;

#[AsDataTable(User::class)]
final class UsersDataTable extends AbstractDataTable
{
    public function configureColumns(): iterable
    {
        yield NumberColumn::new('id', 'ID');
        yield TextColumn::new('email', 'Email');
    }

    protected function configureDataTable(DataTable $table): DataTable
    {
        return $table
            ->serverSide()
            ->processing();
    }

    protected function mapRow(mixed $item): array
    {
        /** @var User $item */
        return [
            'id'    => $item->getId(),
            'email' => $item->getEmail(),
        ];
    }
}

Import the bundle routes once:

// config/routes/ux_datatables.php
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;

return static function (RoutingConfigurator $routes): void {
    $routes->import('@DataTablesBundle/config/routes.php');
};

Pitfalls