overblog / dataloader-bundle
DataLoader Symfony bundle implementation.
Installs: 1 815 203
Dependents: 3
Suggesters: 0
Security: 0
Stars: 46
Watchers: 8
Forks: 14
Open Issues: 6
Type:symfony-bundle
Requires
- php: ^8.1
- overblog/dataloader-php: ^1
- symfony/dependency-injection: ^5.4 || ^6.3 || ^7.0
Requires (Dev)
- phpunit/phpunit: ^10.3
- react/promise: ^2.8.0
- symfony/framework-bundle: ^5.4||^6.3 || ^7.0
- symfony/phpunit-bridge: ^6.3 || ^7.0
- symfony/yaml: ^5.4 || ^6.3 || ^7.0
README
This bundle allows to easy use DataLoaderPHP in your Symfony project by configuring it through configuration.
Requirements
This library requires PHP >= 5.5 to work.
Installation
Download the Bundle
composer require overblog/dataloader-bundle
Enable the Bundle
class AppKernel extends Kernel { public function registerBundles() { $bundles = [ // ... new Overblog\DataLoaderBundle\OverblogDataLoaderBundle(), ]; // ... } // ... }
Getting Started
Here a fast example of how you can use the bundle
overblog_dataloader: defaults: # required promise_adapter: "overblog_dataloader.react_promise_adapter" # optional factory: ~ options: batch: true cache: true max_batch_size: ~ cache_map: "overblog_dataloader.cache_map" cache_key_fn: ~ loaders: users: alias: "users_dataloader" batch_load_fn: "@app.user:getUsers" posts: batch_load_fn: "Post::getPosts" options: max_batch_size: 15 batch: false cache: false cache_map: "app.cache.map" cache_key_fn: "@app.cache" images: factory: my_factory batch_load_fn: "Image\\Loader::get"
This example will create 3 loaders as services:
- "@overblog_dataloader.users_loader" with alias "@users_dataloader"
- "@overblog_dataloader.posts_loader"
- "@overblog_dataloader.images_loader" create using custom factory function "my_factory"
Here the list of existing promise adapters:
- ReactPhp/Promise: overblog_dataloader.react_promise_adapter
- GuzzleHttp/Promises: overblog_dataloader.guzzle_http_promise_adapter
- Webonyx/GraphQL-PHP Sync Promise: overblog_dataloader.webonyx_graphql_sync_promise_adapter
Combine with GraphQLBundle
This bundle can be use with GraphQLBundle. Here an example:
- Bundle config
#graphql overblog_graphql: definitions: schema: query: Query services: promise_adapter: "webonyx_graphql.sync_promise_adapter" #dataloader overblog_dataloader: defaults: promise_adapter: "overblog_dataloader.webonyx_graphql_sync_promise_adapter" loaders: ships: alias: "ships_loader" batch_load_fn: "@app.graph.ships_loader:all"
- Batch loader function
services: app.graph.ship_repository: class: AppBundle\Entity\Repository\ShipRepository factory: ["@doctrine.orm.entity_manager", getRepository] arguments: - AppBundle\Entity\Ship app.graph.ships_loader: class: AppBundle\GraphQL\Loader\ShipLoader arguments: - "@overblog_graphql.promise_adapter" - "@app.graph.ship_repository"
<?php namespace AppBundle\GraphQL\Loader; use AppBundle\Entity\Repository\ShipRepository; use GraphQL\Executor\Promise\PromiseAdapter; class ShipLoader { private $promiseAdapter; private $repository; public function __construct(PromiseAdapter $promiseAdapter, ShipRepository $repository) { $this->promiseAdapter = $promiseAdapter; $this->repository = $repository; } public function all(array $shipsIDs) { $qb = $this->repository->createQueryBuilder('s'); $qb->add('where', $qb->expr()->in('s.id', ':ids')); $qb->setParameter('ids', $shipsIDs); $ships = $qb->getQuery()->getResult(); return $this->promiseAdapter->all($ships); } }
- Usage in a resolver
public function resolveShip($shipID) { $promise = $this->container->get('ships_loader')->load($shipID); return $promise; }
This is an example using the sync promise adapter of Webonyx.
License
Overblog/DataLoaderBundle is released under the MIT license.