Twig: Acesso dinâmico às propriedades do objeto

Criado em 5 abr. 2010  ·  17Comentários  ·  Fonte: twigphp/Twig

obj ['prop'] retornará o valor apenas se obj for um array e não houver maneira de obter a propriedade do objeto se tivermos seu nome em uma variável: obj [propName] retornará nulo

Comentários muito úteis

Você poderia tentar
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

Todos 17 comentários

você pode usar a notação de ponto que irá verificar ambos os arrays e objetos, então obj.name irá procurar primeiro por um obj ['nome'] então obj-> nome e último obj-> getName () isto também é explicado mais adiante na documentação no capítulo Twig para designers.

Acho que o problema de artyv é em relação ao acesso dinâmico às propriedades do objeto, ao invés de simplesmente acessar offsets / propriedades. Veja meu código de exemplo.

/* php */
$obj = new stdClass;
$obj->foo = "bar";
$template->render(array('obj, $obj));

/* twig */
{% set prop as "foo" %}
{{ obj.foo }} 
// outputs "bar" 

{{ obj.$prop }} 
// (pseudo-code)
// would compile down to {{ obj.foo }} and output "bar"

jwpage está certo, o nome da propriedade que eu preciso obter está em outra variável, então eu preciso equivalente a este código php:
$ obj -> {$ propName}
porque $ obj é um objeto simples e não implementa ArrayAccess

Este recurso não será incluído no Twig. Twig é um sistema de template, não uma linguagem completa. Propriedades dinâmicas estão claramente fora do escopo do Twig.

Acho que o componente serializador pode ser usado para converter instâncias stdClass aninhadas em matrizes aninhadas.

Eu acho que apenas por typecasting de um stdClass para um array seria convertido. Por que torná-lo mais difícil do que já é :)

[~] php -r '$class = new stdClass;$class->prop = "hejsa";print_r((array) $class);'      
Array
(
    [prop] => hejsa
)

@henrikbjorn : sim, digite o casting funciona, no entanto, não funciona recursivamente, por isso eu estava sugerindo o componente serializador. obviamente, se você sabe que não tem uma estrutura profundamente aninhada, obviamente apenas faça um cast para um array e pronto.

Eu tive o mesmo problema e resolvi usando um filtro. Eu sei que não é a maneira certa de fazer as coisas, mas certamente parece a mais limpa.

Basicamente, tudo se resume a isso:

function twig_get_filter()
{
    $params = func_get_args();
    $object = array_shift($params);
    $field = implode('', $params);
    return $object->$field;
}

E você pode usá-lo da seguinte maneira:

{{ object|get(text, '_', language, '_', type) }}

Propriedades dinâmicas estão claramente fora do escopo do Twig.

Porque? Estou tentando desenvolver algo como datagrid symfony e gostaria de usar algo assim:

{# columns #}
{% for name, column in grid.columns %}
<td>{{ column.render(row[name])|raw }}</td>
{% endfor %}

Não consigo ver nenhuma solução melhor do que implementar algo como o método Twig_Template :: getAttribute em meu datagrid. Eu gosto de como isso é universal.

Porque é um caso extremo e porque você pode facilmente criar uma função que faz o que você deseja com bastante facilidade (não testado):

function twig_array_get_function($array, $name)
{
    return $array[$name];
}

Uso:

row|array_get(name)

Sim, para matrizes é fácil. O problema é que tenho que implementar também o acesso a getters de objetos etc que já está implementado no Twig (mas não há como usar esse código).

Boas notícias! A partir de 1.2, agora você pode obter um atributo dinâmico em uma variável por meio da nova função attribute (consulte c609060).

É bom ver que o suporte foi adicionado para isso. Estou apenas começando com o Twig. Seria muito difícil mudar a sintaxe para algo como

{{objeto. {propriedade}}} ou {{objeto. {método} (atributos)}}

Acho que é um pouco mais limpo do que {{attribute (object, method, arguments)}}

Talvez você possa me apontar na direção certa? Eu não li todo o código-fonte ainda.

@ rspenc29 : Não quero torná-lo "mais limpo", pois quero que você pense duas vezes antes de usar isso em um modelo. Isso deve ser usado com cuidado, pois na maioria das vezes, é um cheiro de que você está fazendo algo em um modelo que deveria ser feito em outro lugar.

sem problemas. Eu vou descobrir.

ASD dedicado

Você poderia tentar
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

xxfaxy picture xxfaxy  ·  6Comentários

SDPrio picture SDPrio  ·  3Comentários

ericmorand picture ericmorand  ·  4Comentários

rungta picture rungta  ·  3Comentários

dvladimirov77 picture dvladimirov77  ·  5Comentários