overblog/dataloader-bundle

DataLoader Symfony bundle implementation.

Installs: 960 936

Dependents: 0

Suggesters: 0

Security: 0

Stars: 40

Watchers: 8

Forks: 13

Open Issues: 4

Type:symfony-bundle

v0.6.0 2021-12-08 10:47 UTC

This package is auto-updated.

Last update: 2023-01-02 14:33:58 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:

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.