klsoft / yii3-datareader-doctrine
The package provides a Yii 3 data reader that uses the Doctrine ORM
Package info
github.com/klsoft-web/yii3-datareader-doctrine
pkg:composer/klsoft/yii3-datareader-doctrine
1.0.0
2026-03-02 12:13 UTC
Requires
- klsoft/yii3-doctrine: ^1.0
- yiisoft/data: ^2.0
README
The package provides a Yii 3 data reader that uses the Doctrine ORM.
Requirement
- PHP 8.2 or higher.
Installation
composer require yii3-datareader-doctrine
How to use
Example:
use App\Data\Entities\User; use Doctrine\ORM\EntityManagerInterface; use Yiisoft\Data\Reader\Filter\AndX; use Yiisoft\Data\Reader\Filter\Equals; use Yiisoft\Data\Reader\Sort; use Klsoft\Yii3DataReaderDoctrine\DoctrineDataReader; use Yiisoft\Yii\View\Renderer\WebViewRenderer; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; final readonly class UserController { public function __construct( private EntityManagerInterface $entityManager, private WebViewRenderer $viewRenderer) { } public function list(ServerRequestInterface $request): ResponseInterface { return $this->viewRenderer->render( __DIR__ . '/list_template', [ 'dataReader' => (new DoctrineDataReader( $this->entityManager, User::class, ['id', 'name', 'email'])) ->withFilter(new AndX( new Equals('id', 1) ) ) ->withOffset(0) ->withLimit(20) ->withSort(Sort::any() ->withOrder(['id' => 'asc'])) ] ); } }
Example of using the DoctrineDataReader with the GridView from the yiisoft/yii-dataview package
UserController.php:
use App\Data\Entities\User; use Doctrine\ORM\EntityManagerInterface; use Yiisoft\Data\Reader\Filter\AndX; use Yiisoft\Data\Reader\Filter\Equals; use Yiisoft\Data\Reader\Sort; use Klsoft\Yii3DataReaderDoctrine\DoctrineDataReader; use Yiisoft\Yii\View\Renderer\WebViewRenderer; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; final readonly class UserController { public function __construct( private EntityManagerInterface $entityManager, private WebViewRenderer $viewRenderer) { } public function list(ServerRequestInterface $request): ResponseInterface { return $this->viewRenderer->render( __DIR__ . '/list_template', [ 'dataReader' => (new DoctrineDataReader( $this->entityManager, User::class, ['id', 'name', 'email'])) ->withSort(Sort::any(['id', 'name', 'email']) ->withOrder(['name' => 'asc'])) ] ); } }
list_template.php:
<?php declare(strict_types=1); use Yiisoft\View\WebView; use Yiisoft\Yii\DataView\GridView\Column\DataColumn; use Yiisoft\Yii\DataView\GridView\GridView; use Yiisoft\Yii\DataView\YiiRouter\UrlParameterProvider; use Yiisoft\Router\CurrentRoute; use Yiisoft\Data\Paginator\OffsetPaginator; use Yiisoft\Data\Reader\DataReaderInterface; /** * @var WebView $this * @var CurrentRoute $currentRoute * @var DataReaderInterface $dataReader */ $this->setTitle('Users'); ?> <h1>Users</h1> <?= GridView::widget() ->dataReader((new OffsetPaginator($dataReader))->withPageSize(20)) ->urlParameterProvider(new UrlParameterProvider($currentRoute)) ->urlCreator(function (array $arguments, array $queryParameters) use ($currentRoute) { $uri = $currentRoute->getUri(); $query = $uri->getQuery(); $queryData = []; if ($query !== '') { parse_str($query, $queryData); unset($queryData['page']); unset($queryData['prev-page']); unset($queryData['sort']); } if ($queryParameters['page'] !== null) { $queryData['page'] = $queryParameters['page']; } elseif ($queryParameters['prev-page'] !== null) { $queryData['prev-page'] = $queryParameters['prev-page']; } if ($queryParameters['sort'] !== null) { $queryData['sort'] = $queryParameters['sort']; } return count($queryData) > 0 ? '?' . http_build_query($queryData) : $uri->getPath(); }) ->columns( new DataColumn( property: 'id', filter: true ), new DataColumn( property: 'name', filter: true ), new DataColumn( property: 'email', filter: true ) ) ?>