Symfony bundle that integrates gdbots/ncr library.

Installs: 12 519

Dependents: 1

Suggesters: 0

Security: 0

Stars: 0

Watchers: 8

Forks: 0

Open Issues: 0


v3.1.1 2023-07-11 20:42 UTC


Symfony bundle that integrates gdbots/ncr library.


Follow the standard bundle install using gdbots/ncr-bundle as the composer package name.

The examples below assume you're running the DynamoDb Ncr and Elastica NcrSearch.


# many of the configurations below are defaults so you can remove them
# from your configuration, added here for reference

  cloud_region: 'us-west-2'
      debug: '%kernel.debug%'
      timeout: 300 # default
      persistent: true # default
      round_robin: true # default
        - {host: '', port: 9200} # default

    provider: dynamodb
      enabled: true # default
      # IMPORTANT read_through notes for the memoizer
      # If true, the NcrCache will be updated when a cache miss occurs.
      # When the Pbjx request bus is in memory, then you'd want this
      # to be false so there aren't two processes updating the NcrCache.
      # One is the memoizer and the other are event listeners which are
      # updating cache after successful get node requests.
      read_through: false # default
      enabled: true # default
      # by default this cache is the same cache as your application
      # it is recommend to configure this separately because Ncr items
      # can be in cache much longer than app cache, for example, they
      # don't need to be cleared on app deployments.
      provider: # default
      read_through: true # default
      # to customize the cache keys or tweak cache times
      # you must provide your own class and override those methods.
      # see Psr6Ncr::getCacheKey and Psr6Ncr::beforeSaveCacheItem
      #class: Acme\Ncr\Repository\Psr6Ncr
      max_items: 500 # default
        # these apply to batch get operations
        batch_size: 100 # default
        concurrency: 25 # default
        # multi-tenant applications will likely need to provide a custom
        # table manager so node tables can be derived at runtime.
        # class: Acme\Ncr\Repository\DynamoDb\TableManager
        table_name_prefix: my-ncr
          # any SchemaCurie not defined here will end up using the default
          # the entire default key is not needed unless you're changing it
            class: Gdbots\Ncr\Repository\DynamoDb\NodeTable # default
            table_name: multi # default
            table_name: article
            # class is optional but needed if you want to have custom
            # global secondary indexes or customize items before they
            # are put into the table.
            class: Acme\Ncr\Repository\DynamoDb\UserTable
            table_name: user
    provider: elastica
      # your app will at some point need to customize the queries
      # override the class so you can provide these customizations.
      class: Acme\Ncr\Search\Elastica\ElasticaNcrSearch
      query_timeout: '500ms' # default
      clusters: '%es_clusters%'
        # multi-tenant apps will probably need to use a custom class
        #class: Acme\Ncr\Search\Elastica\IndexManager
        index_prefix: my-ncr
            number_of_shards: 5 # default
            number_of_replicas: 1 # default
          # types do not need to be configured unless there is a custom
          # mapping or they must be put into different indexes or types
          # than the automatic handling would provide
            index_name: members # default is "default"
            mapper_class: Acme\Ncr\Search\Elastica\UserMapper

# typically these would be in services.yml file.
  # If you are using AWS ElasticSearch service, use AwsAuthV4ClientManager
    class: Gdbots\Ncr\Search\Elastica\AwsAuthV4ClientManager
      - '@aws_credentials'
      - '%cloud_region%'
      - '%es_clusters%'
      - '@logger'
      - {name: monolog.logger, channel: ncr}

  # recommended, create your own lazy loading handler
  # to optimize batch requests.
    class: Acme\Ncr\NcrLazyLoadingHandler
    public: false
    arguments: ['@ncr_lazy_loader']
      - {name: pbjx.event_subscriber}


It is recommended to have data retrieval be the responsibility of Pbjx requests, however, that strategy doesn't work for all uses cases. Use Symfony autowiring and typehint the interface in your constructor or setter methods to get key Ncr services.

Autowiring supported for these interfaces:

  • Gdbots\Ncr\Ncr
  • Gdbots\Ncr\NcrCache
  • Gdbots\Ncr\NcrLazyLoader
  • Gdbots\Ncr\NcrSearch

Twig Extension

The NcrExtension provides a function called ncr_get_node. It is important to note that this does NOT make a query to get a node, instead it pulls from NcrCache.

This might change in the future, but this strategy eliminates horribly performing twig templates that make Ncr queries.

The function will accept a MessageRef, NodeRef or a string version of a NodeRef.

Example use of ncr_get_node:

{% set created_by = ncr_get_node(pbj.get('created_by_ref')) %}
Here is the creator:
{{ created_by }}

Other twig functions (documentation wip):

  • ncr_deref_nodes
  • ncr_get_preloaded_nodes
  • ncr_get_preloaded_published_nodes
  • ncr_is_node_published
  • ncr_preload_node
  • ncr_preload_nodes
  • ncr_preload_embedded_nodes
  • ncr_to_node_ref

Console Commands

This library provides the basics for creating and extracting data from the Ncr services. Run the Symfony console and look for ncr commands.

ncr:create-search-storage    Creates the NcrSearch storage.
ncr:create-storage           Creates the Ncr storage.
ncr:describe-search-storage  Describes the NcrSearch storage.
ncr:describe-storage         Describes the Ncr storage.
ncr:export-nodes             Pipes nodes from the Ncr to STDOUT.
ncr:get-node                 Fetches a single node by its NodeRef and writes to STDOUT.
ncr:reindex-nodes            Pipes nodes from the Ncr and reindexes them.
ncr:sync-node                Syncs a single node from the Ncr with the EventStore.
ncr:sync-nodes               Syncs nodes from the Ncr with the EventStore.

Review the --help on the ncr commands for more details.