overblog / dataloader-bundle
DataLoader Symfony 扩展实现。
v1.1.0
2024-07-01 12:24 UTC
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
此扩展允许通过配置轻松在您的Symfony项目中使用DataLoaderPHP。
需求
此库需要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" 创建
以下是现有的承诺适配器列表
- ReactPhp/Promise: overblog_dataloader.react_promise_adapter
- GuzzleHttp/Promises: overblog_dataloader.guzzle_http_promise_adapter
- Webonyx/GraphQL-PHP 同步承诺: overblog_dataloader.webonyx_graphql_sync_promise_adapter
与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许可下发布。