Я определил функцию 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
.