Naming Strategies

Naming Strategies

Sometimes, the representation of a property should not share the same name as the property itself. As an example, when serializing an object for a JSON payload, you may want to convert camelCase properties to underscore_separated properties, and vice versa when deserializing JSON to an object.

To make that possible, laminas-hydrator provides naming strategies. These are similar to strategies, but instead of operating on the value, they operate on the name.

NamingStrategyInterface

Naming strategies implement Laminas\Hydrator\NamingStrategy\NamingStrategyInterface:

namespace Laminas\Hydrator\NamingStrategy;

/**
 * Allow property extraction / hydration for hydrator
 */
interface NamingStrategyInterface
{
    /**
     * Converts the given name so that it can be extracted by the hydrator.
     *
     * @param null|mixed[] $data The original data for context.
     */
    public function hydrate(string $name, ?array $data = null) : string;

    /**
     * Converts the given name so that it can be hydrated by the hydrator.
     *
     * @param null|object $object The original object for context.
     */
    public function extract(string $name, ?object $object = null) : string;
}

Providing naming strategies

Hydrators can indicate they will consume naming strategies, as well as allow registration of them, by implementing Laminas\Hydrator\NamingStrategy\NamingStrategyEnabledInterface:

namespace Laminas\Hydrator\NamingStrategy;

interface NamingStrategyEnabledInterface
{
    /**
     * Sets the naming strategy.
     */
    public function setNamingStrategy(NamingStrategyInterface $strategy) : void;

    /**
     * Gets the naming strategy.
     */
    public function getNamingStrategy() : NamingStrategyInterface;

    /**
     * Checks if a naming strategy exists.
     */
    public function hasNamingStrategy() : bool;

    /**
     * Removes the naming strategy.
     */
    public function removeNamingStrategy() : void;
}

We provide a default implementation of this interface within the Laminas\Hydrator\AbstractHydrator definition. Its getNamingStrategy() will lazy-load an IdentityNamingStrategy if none has been previously registered. Since all shipped hydrators extend AbstractHydrator, they can consume naming strategies.

Shipped naming strategies

We provide the following naming strategies: