Сделайте метод Twig-безопасной функции также Twig-safe - PullRequest
0 голосов
/ 26 декабря 2018

Я определил функцию Twig следующим образом:

new Twig_SimpleFunction('link', 'html_link', ['is_safe' => ['html']]);

, поэтому каждый {{ link(...) }} не экранируется Twig автоматически.Это работает.

Но html_link() возвращает объект Link, который можно настроить в шаблоне, чтобы добавить URL #fragment или ссылку [attribute]:

{{ link('url', 'label').withFragment('foo') }}
{{ link('url', 'label').withClass('special') }}

НоTwig обнаруживает, что это больше не чистый link(), поэтому он больше не является безопасным для html, и мне нужно добавить |raw, чтобы он заработал:

{{ link('url', 'label').withFragment('foo')|raw }}
{{ link('url', 'label').withClass('special')|raw }}

Что работает.Но.Не очень красиво.

Могу ли я сказать Twig, что link().withFragment() и link().withClass() по-прежнему безопасны для html?

Пользовательские фильтры имеют опцию preserves_safety, которая вроде работает примерно так:

{{ someFunction(someVar)|someFilter }}

Если someFunfction безопасен для html, а someFilter был определен с помощью preserves_safety, вывод все еще безопасен.Я не хочу делать фильтры для любого метода Link, так что это не совсем хорошо.


Я не могу использовать Twig_Markup, потому что:

  • Он должен оставаться объектом как можно дольше (withFragment, withClass и т. Д. Возвращать $this), поэтому вы можете сделать с ним несколько вещей, например, добавить класс И фрагмент.
  • Этодолжен быть применим за пределами Twig.Электронные письма и флеш-сообщения могут содержать ссылки.Только Твиг знает (и должен знать), что такое Twig_Markup.Поскольку это не интерфейс, я не могу добавить его в класс Link.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...