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
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
Comentários muito úteis
Você poderia tentar
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html