function EntityCondition::validate

Same name and namespace in other branches
  1. 8.9.x core/modules/jsonapi/src/Query/EntityCondition.php \Drupal\jsonapi\Query\EntityCondition::validate()
  2. 10 core/modules/jsonapi/src/Query/EntityCondition.php \Drupal\jsonapi\Query\EntityCondition::validate()
  3. 11.x core/modules/jsonapi/src/Query/EntityCondition.php \Drupal\jsonapi\Query\EntityCondition::validate()

Validates the filter has the required fields.

1 call to EntityCondition::validate()
EntityCondition::createFromQueryParameter in core/modules/jsonapi/src/Query/EntityCondition.php
Creates an EntityCondition object from a query parameter.

File

core/modules/jsonapi/src/Query/EntityCondition.php, line 138

Class

EntityCondition
A condition object for the EntityQuery.

Namespace

Drupal\jsonapi\Query

Code

protected static function validate($parameter) {
    $valid_key_combinations = [
        [
            static::PATH_KEY,
            static::VALUE_KEY,
        ],
        [
            static::PATH_KEY,
            static::OPERATOR_KEY,
        ],
        [
            static::PATH_KEY,
            static::VALUE_KEY,
            static::OPERATOR_KEY,
        ],
    ];
    $given_keys = array_keys($parameter);
    $valid_key_set = array_reduce($valid_key_combinations, function ($valid, $set) use ($given_keys) {
        return $valid ? $valid : count(array_diff($set, $given_keys)) === 0;
    }, FALSE);
    $has_operator_key = isset($parameter[static::OPERATOR_KEY]);
    $has_path_key = isset($parameter[static::PATH_KEY]);
    $has_value_key = isset($parameter[static::VALUE_KEY]);
    $cacheability = (new CacheableMetadata())->addCacheContexts([
        'url.query_args:filter',
    ]);
    if (!$valid_key_set) {
        // Try to provide a more specific exception is a key is missing.
        if (!$has_operator_key) {
            if (!$has_path_key) {
                throw new CacheableBadRequestHttpException($cacheability, "Filter parameter is missing a '" . static::PATH_KEY . "' key.");
            }
            if (!$has_value_key) {
                throw new CacheableBadRequestHttpException($cacheability, "Filter parameter is missing a '" . static::VALUE_KEY . "' key.");
            }
        }
        // Catchall exception.
        $reason = "You must provide a valid filter condition. Check that you have set the required keys for your filter.";
        throw new CacheableBadRequestHttpException($cacheability, $reason);
    }
    if ($has_operator_key) {
        $operator = $parameter[static::OPERATOR_KEY];
        if (!in_array($operator, static::$allowedOperators)) {
            $reason = "The '" . $operator . "' operator is not allowed in a filter parameter.";
            throw new CacheableBadRequestHttpException($cacheability, $reason);
        }
        if (in_array($operator, [
            'IS NULL',
            'IS NOT NULL',
        ]) && $has_value_key) {
            $reason = "Filters using the '" . $operator . "' operator should not provide a value.";
            throw new CacheableBadRequestHttpException($cacheability, $reason);
        }
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.