Я интегрирую Twig в существующий проект.
Я пишу синтаксический анализатор токенов для анализа пользовательского тега, аналогичного тегу {% render %}
.
Мой тег выглядит следующим образом:
{% mytag 'somestring' with { 'name': name, 'color': 'green' } %}
, где имя определяется как {% set name = 'foo' %}
Я могу проанализировать somestring
без каких-либо проблем.
Этокод, используемый для разбора содержимого в with{ }
:
$Stream = $this->parser->getStream();
if ( $Stream->test( \Twig_Token::NAME_TYPE, 'with' ) )
{
$Stream->next();
$parsedParameters = $this->parser->getExpressionParser()->parseExpression();
$parameters = $this->parser->getEnvironment()->compile( $parsedParameters );
var_dump( $parameters ); //string 'array( "name" => $this->getContext( $context, "name" ), "color" => "green" )' (length=72)
foreach ( $parsedParameters->getIterator() as $parameter )
{
//var_dump($ parameter->getAttribute('value') );
}
}
Моя цель - превратить 'name': name, 'color': 'green'
в ассоциативный массив в анализаторе токенов:
array(
'name' => 'foo',
'color': 'green',
)
В качестве документациидовольно редко, и код в библиотеке не прокомментирован, я не уверен, как это сделать.Если я переберу $parsedParameters
, я получу 4 элемента, состоящих из ключа массива и значения массива.Однако, поскольку name
- это переменная с типом Twig_Node_Expression_Name
, я не уверен, как ее скомпилировать, чтобы получить скомпилированное значение.В настоящее время я нашел способ скомпилировать этот узел, но все, что он мне дает, это строка, содержащая выражение PHP, которое я не могу использовать.
Как я могу превратить проанализированное выражение в ассоциативный массив?