Подтвердить что ты не робот

Объект доступа Twig

Я хочу получить доступ к значению объекта внутри шаблона ветки.

Обычно я получаю такое возвращение:

echo $lang->get("test");

Но как я могу сделать то же самое в шаблоне с веточкой?

Я пробовал так много методов, но никто не работал.

Например, я попробовал:

{{ attribute(lang, get, 'test') }} 

с результатом

Допустимая фатальная ошибка: аргумент 3 передан Twig_Node_Expression_GetAttr:: __ construct() должен быть экземпляром Twig_Node_Expression_Array, экземпляр Twig_Node_Expression_Constant дано

спасибо

4b9b3361

Ответ 1

То, что вы пытаетесь сделать, это вызвать метод объекта с параметрами в шаблоне Twig. Я не думаю, что это поддерживается, поскольку это, вероятно, считается плохим. Twig поддерживает понятие геттеров на объекте, которые вызываются без параметров:

{{ lang.test }}

попытается вызвать одно из следующего: в этом порядке:

  • $lang->test
  • $lang->test()
  • $lang->getTest()
  • $lang->isTest()

Если объект реализует любой из этих аксессуаров и соглашений, Twig найдет его. Все, что находится вне этого соглашения, например get('test'), не является частью философии Twig. И это не широко используемая идиома вообще, поэтому вам, вероятно, следует придерживаться одного из вышеуказанных методов.

См. http://twig.sensiolabs.org/doc/templates.html#variables.

Вы можете реализовать магические методы __isset, __get или __call для поддержки одного из этих методов доступа.

Ответ 2

Я знаю, что это старый вопрос, но после 3 часов очистки Интернета и отсутствия примеров я хотел убедиться, что он документально подтвержден.

Возвращаясь к одной из ваших первоначальных попыток:

{{ attribute(lang, get, 'test') }}

Я пытаюсь сделать то же самое, и это должно работать в соответствии с документацией. К сожалению, примеров использования этого нет. Все, что я нашел, это то, что имя метода (get) должно было быть строкой ( "get" ), поэтому я изменил ее, но она все еще не работает. То, что я закончил, было следующим:

{% set myText = lang.get('test') %}
{{ myText }}

Это сработало отлично, но мне нужно написать много кода, когда я должен все это делать. Поэтому я сделал простой шаблон с обоими методами и рассмотрел скомпилированный вывод. Оригинал был скомпилирован следующим образом:

echo twig_escape_filter($this->env, $this->getAttribute((isset($context["lang"]) ? $context["lang"] : null), "get", "test"), "html", null, true);

и второй (2 лайнер):

$context["myText"] = $this->getAttribute((isset($context["lang"]) ? $context["lang"] : null), "get", array(0 => "test"), "method");
echo twig_escape_filter($this->env, (isset($context["myText"]) ? $context["myText"] : null), "html", null, true);

После изучения я понял разницу (проверьте 3-й параметр на getAttribute), параметр arguments - это массив! Это хорошая информация. Я изменил свое оригинальное на это:

{{ attribute(lang, 'get', ['test']) }}

и теперь он работает!

Надеюсь, это поможет кому-то!