Nano Hash - криптовалюты, майнинг, программирование

Как использовать шаблон Symfony Decorator для изменения функции Twig?

Я пытаюсь изменить вывод {{ url('app_route_name') }} or {{ path('app_route_name') }}. Обычно вывод может быть /app/route/name. Я хочу изменить только вывод ветки.

Моя первая попытка состояла в том, чтобы украсить UrlGenerator-›generate, но изменение $name также изменило вызываемый контроллер. Я просто хочу изменить конечный результат.

Вот код, который я сейчас пытаюсь. Исключение ошибки, которое я получаю:

Функция неизвестного пути. Вы имели в виду logout_path, относительный_путь, impersonation_exit_path?

    App\Service\TwigUrlDecorator:
        decorates: 'twig.extension.routing'
        arguments: ['@.inner']
        public: false
// src/Service/TwigUrlDecorator.php

namespace App\Service;

use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Twig\Extension\AbstractExtension;
use Symfony\Bridge\Twig\Extension\RoutingExtension;

class TwigUrlDecorator extends AbstractExtension
{
    private $generator;
    private $router;

    public function __construct(RoutingExtension $router, UrlGeneratorInterface $generator)
    {
        $this->router = $router;
        $this->generator = $generator;
    }

    public function getPath(string $name, array $parameters = [], bool $relative = false): string
    {
        return $this->generator->generate($name, $parameters, $relative ? UrlGeneratorInterface::RELATIVE_PATH : UrlGeneratorInterface::ABSOLUTE_PATH);
    }

    public function getUrl(string $name, array $parameters = [], bool $schemeRelative = false): string
    {
        return $this->generator->generate($name, $parameters, $schemeRelative ? UrlGeneratorInterface::NETWORK_PATH : UrlGeneratorInterface::ABSOLUTE_URL);
    }

}

Мой исходный вопрос может пролить свет на то, что я ищу.

09.04.2021

  • Вы должны иметь возможность получить исходный результат, внедрив среду и выполнив $env->getExtension('Symfony\Bridge\Twig\Extension\RoutingExtension')->getUrl($parms). Затем я бы изменил вывод оттуда. 09.04.2021
  • Кажется, вы не до конца разбираетесь в декорировании. Теперь ваш сервис будет вызываться вместо оригинального. И ваш сервис не включает определения функций ветки. 09.04.2021
  • @yivi Вы правы, я узнал об этом только из моего предыдущего вопроса, который я указал. Я провел весь день, исследуя украшения, и нашел очень мало того, как сделать это от начала до конца. только фрагменты, которые бесполезны, когда я не знаю, как их включить... 09.04.2021
  • Вам нужно лучше понять, что такое украшение и как создаются расширения веток. Если вы понимаете обе части, то последующее будет тривиальным. Ответ Нико уже показал вам, что вам нужно добавить в свой декоратор. Это все, что вам нужно на данный момент. Удачи. 09.04.2021
  • Я создал расширение для фильтрации своих URL-адресов, я мог бы вернуться к этому вопросу после того, как немного поиграл с расширениями. 10.04.2021

Ответы:


1

Где вы определили функцию Twig path? Вы украсили twig.extension.routing без определения каких-либо функций Twig. В настоящее время вызывается метод getFunctions класса AbstractExtension, который возвращает пустой список функций.

Как обычно в декорациях: если вы хотите выполнить какие-либо методы в оригинальном сервисе, вам нужно перенаправить такие вызовы. Что-то вроде этого может помочь:

public function getFunctions(): array {
  return $this->router->getFunction();
}

Кроме того, вы должны проверить наименования свойств. В текущем состоянии $router содержит не маршрутизатор, а расширение Twig для маршрутизации. Для меня это выглядит довольно запутанно, так как правильный маршрутизатор будет предоставлять совершенно другие методы, чем расширение Twig.

09.04.2021
  • Я не определял path, это функция ветки. Это функция, которую я пытаюсь изменить. 09.04.2021
  • Да, вы не определили эту функцию Twig, но, украсив исходный сервис, вы удалили его определение этой функции - path не является чем-то вроде встроенной функции. 09.04.2021
  • Я не тестировал ваше решение, но я почти уверен, что оно приведет к вызову исходного getPath, поскольку getFunctions в основном возвращает указатели на методы getPath/getUrl. Уверен, что вам нужно скопировать/вставить RoutingExtension::getFunctions в службу оформления или, по крайней мере, добавить TwigFunction к результатам. Я думаю, у меня возникнет соблазн просто скопировать/вставить весь класс RoutingExtension, а затем изменить имя класса обслуживания. 09.04.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..