Twig: ๊ฐœ์ฒด ์†์„ฑ์— ๋Œ€ํ•œ ๋™์  ์•ก์„ธ์Šค

์— ๋งŒ๋“  2010๋…„ 04์›” 05์ผ  ยท  17์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: twigphp/Twig

obj['prop']๋Š” obj๊ฐ€ ๋ฐฐ์—ด์ด๊ณ  ๋ณ€์ˆ˜์— ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ์ฒด ์†์„ฑ์„ ๊ฐ€์ ธ์˜ฌ ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. obj[propName]์€ null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‹น์‹ ์€ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

๋ชจ๋“  17 ๋Œ“๊ธ€

๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋ฅผ ๋ชจ๋‘ ๊ฒ€์‚ฌํ•˜๋Š” ์  ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ obj.name์€ ๋จผ์ € obj['name']์„ ์ฐพ์€ ๋‹ค์Œ obj->name๊ณผ ๋งˆ์ง€๋ง‰ obj->getName()์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์„ค๋ช…์„œ์—์„œ๋„ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋””์ž์ด๋„ˆ๋ฅผ ์œ„ํ•œ ๋‚˜๋ญ‡๊ฐ€์ง€ ์žฅ ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

artyv์˜ ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํžˆ ์˜คํ”„์…‹/์†์„ฑ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ ๊ฐœ์ฒด ์†์„ฑ์— ๋™์ ์œผ๋กœ ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

/* 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๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ์†์„ฑ ์ด๋ฆ„์€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ์žˆ์œผ๋ฏ€๋กœ ์ด PHP ์ฝ”๋“œ์™€ ๋™๋“ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
$obj->{$propName}
$obj๋Š” ๋‹จ์ˆœํ•œ ๊ฐ์ฒด์ด๊ณ  ArrayAccess๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—

์ด ๊ธฐ๋Šฅ์€ Twig์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Twig๋Š” ์™„์ „ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ํ…œํ”Œ๋ฆฟ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ๋™์  ์†์„ฑ์€ ๋ถ„๋ช…ํžˆ Twig ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค.

์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘์ฒฉ๋œ stdClass ์ธ์Šคํ„ด์Šค๋ฅผ ์ค‘์ฒฉ๋œ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” stdClass๋ฅผ ๋ฐฐ์—ด๋กœ ํƒ€์ž…์บ์ŠคํŒ…ํ•จ์œผ๋กœ์จ ๋ณ€ํ™˜๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์™œ ์ง€๊ธˆ๋ณด๋‹ค ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ์„ธ์š” :)

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

@henrikbjorn : ์˜ˆ ์œ ํ˜• ์บ์ŠคํŒ…์ด ์ž‘๋™ํ•˜์ง€๋งŒ ์žฌ๊ท€์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ์•ˆํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋‹น์‹ ์ด ๊นŠ์ด ์ค‘์ฒฉ๋œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๋ถ„๋ช…ํžˆ ๋ฐฐ์—ด๋กœ ์บ์ŠคํŠธํ•˜๋ฉด ๋์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ผ์„ ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ์ง€๋งŒ ํ™•์‹คํžˆ ๊ฐ€์žฅ ๊นจ๋—ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋™์  ์†์„ฑ์€ ๋ถ„๋ช…ํžˆ Twig ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค.

์™œ์š”? symfony datagrid์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐœ๋ฐœํ•˜๋ ค๊ณ ํ•˜๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

๋‚ด ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ์—์„œ Twig_Template::getAttribute ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๋ณดํŽธ์ ์ธ์ง€ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ์ด๊ณ  ์›ํ•˜๋Š” ๊ฒƒ์„ ๋งค์šฐ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—(ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์Œ):

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

์šฉ๋ฒ•:

row|array_get(name)

์˜ˆ, ์–ด๋ ˆ์ด์˜ ๊ฒฝ์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” Twig์—์„œ ์ด๋ฏธ ๊ตฌํ˜„๋œ ๊ฐ์ฒด ๋“ฑ์˜ getter์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ๋„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ ์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค).

์ข‹์€ ์†Œ์‹! 1.2๋ถ€ํ„ฐ๋Š” ์ƒˆ๋กœ์šด attribute ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋™์  ์†์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(c609060 ์ฐธ์กฐ).

์ด์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ๋ณด๋‹ˆ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด์ œ ๋ง‰ Twig๋ฅผ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šธ๊นŒ์š”?

{{ ๊ฐœ์ฒด.{์†์„ฑ} }} ๋˜๋Š” {{ ๊ฐœ์ฒด.{๋ฉ”์„œ๋“œ}(์†์„ฑ) }}

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด {{ attribute(object, method, arguments) }}๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๊นจ๋—ํ•˜๋‹ค๊ณ  โ€‹โ€‹์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜๋ฅผ ๊ฐ€๋ฆฌ์ผœ ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์•„์ง ๋ชจ๋“  ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@rspenc29 : ํ…œํ”Œ๋ฆฟ์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‘ ๋ฒˆ ์ƒ๊ฐํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ "๊นจ๋—ํ•˜๊ฒŒ" ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์—์„œ ๋ญ”๊ฐ€๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋ƒ„์ƒˆ์ž…๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์•„์š”. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์•„๋‚ผ ๊ฒƒ์ด๋‹ค.

asd ์ „์šฉ

๋‹น์‹ ์€ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰