Объект доступа Twig
Я хочу получить доступ к значению объекта внутри шаблона ветки.
Обычно я получаю такое возвращение:
echo $lang->get("test");
Но как я могу сделать то же самое в шаблоне с веточкой?
Я пробовал так много методов, но никто не работал.
Например, я попробовал:
{{ attribute(lang, get, 'test') }}
с результатом
Допустимая фатальная ошибка: аргумент 3 передан Twig_Node_Expression_GetAttr:: __ construct() должен быть экземпляром Twig_Node_Expression_Array, экземпляр Twig_Node_Expression_Constant дано
спасибо
Ответы
Ответ 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']) }}
и теперь он работает!
Надеюсь, это поможет кому-то!