overblog/dataloader-bundle

DataLoader Symfony bundle implementation.

Maintainers

👁 Overblog

Package info

github.com/overblog/dataloader-bundle

Type:symfony-bundle

pkg:composer/overblog/dataloader-bundle

Statistics

Installs: 2 609 925

Dependents: 3

Suggesters: 0

Stars: 47

Open Issues: 8

v1.1.0 2024-07-01 12:24 UTC

Requires

Requires (Dev)

Suggests

None

Provides

None

Conflicts

None

Replaces

None

MIT 6ac3ab346fc8ae88cd964d462defc451d335a4de

cachingBatchingdataLoader

This package is auto-updated.

Last update: 2026-06-25 15:12:48 UTC


README

This bundle allows to easy use DataLoaderPHP in your Symfony project by configuring it through configuration.

👁 Build Status
👁 Coverage Status
👁 Latest Stable Version
👁 License

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:

Configuration using attributes

This bundle supports autoconfiguration via attributes. Add Overblog\DataLoaderBundle\Attribute\AsDataLoader on the service you want to expose as data loader:

<?php

#[Overblog\DataLoaderBundle\Attribute\AsDataLoader(name: "users", alias: "users_dataloader")]
class UserLoader {
 public function __invoke(array $ids): array
 {
 return ["John", "Steve", "Nash"];
 }
}

?>

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.