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