Skip to content
Snippets Groups Projects
BuilderBag.php 2.07 KiB
Newer Older
<?php

/*
 * This file is part of the ONGR package.
 *
 * (c) NFQ Technologies UAB <info@nfq.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace ONGR\ElasticsearchDSL;
 * Container for named builders.
Denis Urban's avatar
Denis Urban committed
    private array $bag = [];
     * @param BuilderInterface[] $builders
    public function __construct($builders = [])
    {
        foreach ($builders as $builder) {
            $this->add($builder);
        }
    }

    /**
     * Adds a builder.
     */
Denis Urban's avatar
Denis Urban committed
    public function add(BuilderInterface $builder): string
Denis Urban's avatar
Denis Urban committed
        $name = method_exists($builder, 'getName') ? $builder->getName() : bin2hex(random_bytes(30));

        $this->bag[$name] = $builder;

        return $name;
     * Checks if builder exists by a specific name.
Denis Urban's avatar
Denis Urban committed
    public function has(string $name): bool
    {
        return isset($this->bag[$name]);
    }

    /**
     * Removes a builder by name.
     */
Denis Urban's avatar
Denis Urban committed
    public function remove(string $name): void
    {
        unset($this->bag[$name]);
    }

    /**
     * Clears contained builders.
     */
Denis Urban's avatar
Denis Urban committed
    public function clear(): void
    {
        $this->bag = [];
    }

    /**
     * Returns a builder by name.
     */
Denis Urban's avatar
Denis Urban committed
    public function get(string $name): ?BuilderInterface
Denis Urban's avatar
Denis Urban committed
        return $this->bag[$name] ?? null;
    public function toArray(): array|\stdClass
        foreach ($this->all() as $builder) {
            $output = array_merge($output, $builder->toArray());
Denis Urban's avatar
Denis Urban committed

    /**
     * Returns all builders contained.
     *
     * @return BuilderInterface[]
     */
    public function all(mixed $type = null): array
    {
        return array_filter(
            $this->bag,
            /** @var BuilderInterface $builder */
            static fn(BuilderInterface $builder): bool => $type === null || $builder->getType() == $type
        );
    }