Awesome
DataLoaderBundle
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.