Как добавить расширение Sandbox для TWIG в плагин Timber WordPress?

Я хочу добавить расширение Sandbox для оценки ненадежного кода с помощью Timber для WordPress (включено с помощью композитора, но я получаю тот же результат при использовании плагина).

Следующий (упрощенный) код приводит к фатальной ошибке.

add_filter('timber/twig', function($twig){

    $filters = array_diff(array_keys($twig->getFilters()), ['function']);

    $policy = new \Twig\Sandbox\SecurityPolicy([], $filters, [], [], []);
    $twig->addExtension(new \Twig\Extension\SandboxExtension($policy, true));
    
    return $twig;
});

Ошибка: Неустранимая ошибка: Uncaught Exception: невозможно зарегистрировать песочницу расширений, поскольку расширения уже инициализированы.

Не имеет значения, применяется ли фильтр «дерево/ветка» или «twig_apply_filters».

Это неправильное место для добавления этого расширения? Кажется, он выполняется только при вызове Timber::compile_string.

Я использую последние версии WordPress и Timber на PHP 7.3.x.


person RubyTuesday    schedule 22.06.2020    source источник
comment
Что, если вы используете add_filter() вместо add_action()?   -  person Gchtr    schedule 29.06.2020
comment
@Gchtr спасибо, что указали на это - я соответствующим образом скорректировал. Опечатка с моей стороны, в моем коде это как add_filter(). Между прочим, add_action() вызывает add_filter(), так что разницы нет.   -  person RubyTuesday    schedule 02.07.2020
comment
Хорошо, я попробовал ваш код, и для меня ошибки нет. Итак, куда вы добавляете этот фрагмент кода, в functions.php? Применяются ли другие timber/twig фильтры?   -  person Gchtr    schedule 03.07.2020
comment
@Gchtr, спасибо, что подтвердили, что это работает. Мне удалось заставить работать упрощенную версию кода. Причиной ошибки было то, что при разработке аргументов политики я вызывал getFilters() и getFunctions(), и это вызывало инициализацию расширений.   -  person RubyTuesday    schedule 04.07.2020
comment
Полезно знать, я рад, что у тебя получилось!   -  person Gchtr    schedule 06.07.2020


Ответы (1)


$twig->getFilters() вызывает инициализацию расширений и поэтому не может использоваться здесь для этой цели. При удалении этого кода ошибки нет, и расширение песочницы регистрируется.

person RubyTuesday    schedule 04.07.2020