overblog/dataloader-bundle

DataLoader Symfony 扩展实现。

安装次数: 1,718,799

依赖项: 3

建议者: 0

安全: 0

星标: 45

关注者: 9

分支: 14

开放问题: 6

类型:symfony-bundle

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

This package is auto-updated.

Last update: 2024-08-31 14:35:49 UTC


README

此扩展允许通过配置轻松在您的Symfony项目中使用DataLoaderPHP

Build Status Coverage Status Latest Stable Version License

需求

此库需要PHP >= 5.5才能运行。

安装

下载扩展

composer require overblog/dataloader-bundle

启用扩展

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = [
            // ...

            new Overblog\DataLoaderBundle\OverblogDataLoaderBundle(),
        ];

        // ...
    }

    // ...
}

入门指南

以下是一个快速示例,说明如何使用此扩展

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"

此示例将创建3个加载器作为服务

  • "@overblog_dataloader.users_loader" 使用别名 "@users_dataloader"
  • "@overblog_dataloader.posts_loader"
  • "@overblog_dataloader.images_loader" 使用自定义工厂函数 "my_factory" 创建

以下是现有的承诺适配器列表

与GraphQLBundle结合使用

此扩展可以与GraphQLBundle一起使用。以下是一个示例

  • 扩展配置
#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"
  • 批量加载函数
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);
    }
}
  • 在解析器中的使用
    public function resolveShip($shipID)
    {
        $promise = $this->container->get('ships_loader')->load($shipID);

        return $promise;
    }

这是使用Webonyx同步承诺适配器的一个示例。

许可协议

Overblog/DataLoaderBundle 在MIT许可下发布。