Условия маршрута Symfony DSL Context - PullRequest
2 голосов
/ 26 марта 2019

Краткая версия: к каким объектам я, программист конечного пользователя, имею доступ при использовании условий маршрутизации Symfony?

Длинная версия: маршруты Symfony позволяют использовать ключ с именем condition.

contact:
    path:       /contact
    controller: 'App\Controller\DefaultController::contact'
    condition:  "context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') matches '/firefox/i'"

Значение condition - это код - это специфичный для домена Symfony язык (DSL), основанный (но не идентичный?) Синтаксису языка шаблонов веток. Документы Symfony именуются «Синтаксис выражений» .

Столько всего я смог почерпнуть из документации. Что я не могу понять, так это к какому объекту я получу доступ при использовании этого DSL? то есть в приведенном выше примере выражение, кажется, имеет доступ к объекту context и объекту request.

Есть ли другие? Есть ли в исходном коде документы или место, где я могу увидеть, к каким другим объектам у меня будет доступ с помощью condition?

1 Ответ

1 голос
/ 26 марта 2019

В документации , которую вы связываете , говорится, что в выражении доступны только эти два объекта:

Вы можете использовать в выражении любую сложную логику, которая вам нужна, используя две переменные, которые передаются в выражение :

context - экземпляр RequestContext, который содержит основную информацию о сопоставляемом маршруте.

request - SymfonyRequest объект (см. Запрос).

(выделение мое).

Вы можете видеть, где эти объекты вводятся в выражение в Symfony\Component\Routing\Matcher\UrlMatcher::handleRouteRequirements():

protected function handleRouteRequirements($pathinfo, $name, Route $route)
{
    // expression condition
    if ($route->getCondition() && !$this->getExpressionLanguage()->evaluate($route->getCondition(), ['context' => $this->context, 'request' => $this->request ?: $this->createRequest($pathinfo)])) {
        return [self::REQUIREMENT_MISMATCH, null];
    }

    return [self::REQUIREMENT_MATCH, null];
}

Вызов evaluate() передает как выражение, которое вы определили для клавиши condition, так и массив с $context и $request.

...