Php 细枝表达

Php 细枝表达,php,twig,Php,Twig,我正在整合一个现有的项目 我正在编写一个令牌解析器来解析一个与{%render%}标记类似的自定义标记 我的标签看起来像: {% mytag 'somestring' with { 'name': name, 'color': 'green' } %} 其中名称由{%set name='foo%}定义 我能够解析一些字符串而没有任何问题 这是用于用{}解析中的内容的代码: 我的目标是将“name”:name;“color”:“green”转换为令牌解析器中的关联数组: array( 'n

我正在整合一个现有的项目

我正在编写一个令牌解析器来解析一个与{%render%}标记类似的自定义标记

我的标签看起来像:

{% mytag 'somestring' with { 'name': name, 'color': 'green' } %}
其中名称由{%set name='foo%}定义

我能够解析一些字符串而没有任何问题

这是用于用{}解析中的内容的代码:

我的目标是将“name”:name;“color”:“green”转换为令牌解析器中的关联数组:

array(
   'name' => 'foo',
   'color': 'green',
)
由于文档非常稀少,而且库中的代码没有注释,我不知道如何做到这一点。如果我循环使用$parsedParameters,我会得到4个元素,由数组键和数组值组成。但是,由于name是一个类型为Twig\u Node\u Expression\u name的变量,我不确定如何编译它以获得编译后的值。目前,我已经找到了一种编译该节点的方法,但它给我的只是一个包含PHP表达式的字符串,我无法使用它


如何将解析后的表达式转换为关联数组?

好的。我想我能解决这个问题。不漂亮,但应该有用

$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)

    $index = null;
    $value = null;

    foreach ( $parsedParameters->getIterator() as $parameter )
    {
        if ( $parameter->hasAttribute( 'value' ) )
        {
            $index = $parameter->getAttribute( 'value' );
        }
        elseif ( $parameter->hasAttribute( 'name' ) )
        {
            $value = $parameter->getAttribute( 'name' );
        }

        if ( isset( $index, $value ) )
        {
            $params[ $index ] = $value;

            $index = null;
            $value = null;
        }
    }
}
这里有数组参数,可以传递给自定义节点

$params = var_export( $properties['params'], true );
unset( $fieldProperties['params'] );
现在我只做了以下几点:

$Compiler
    ->write( "\$params = array();\n" )

    ->write( "foreach ( {$params} as \$searchFor => \$replaceWith )\n" )
    ->write( "{\n" )
    ->write( "\t\$params[ \$searchFor ] = str_replace( \$replaceWith, \$context[\$replaceWith], \$replaceWith );\n" )
    ->write( "}\n" )

    ->write( "var_dump( \$params );\n" );
应该是这样

我也明白了,你在哪里谈论TokenParser,但遗憾的是,我还没有找到解决方案,把它翻过来

$Compiler
    ->write( "\$params = array();\n" )

    ->write( "foreach ( {$params} as \$searchFor => \$replaceWith )\n" )
    ->write( "{\n" )
    ->write( "\t\$params[ \$searchFor ] = str_replace( \$replaceWith, \$context[\$replaceWith], \$replaceWith );\n" )
    ->write( "}\n" )

    ->write( "var_dump( \$params );\n" );