2
2
3
3
namespace Cosmologist \Bundle \SymfonyCommonBundle \Twig ;
4
4
5
- use Twig_Extension ;
5
+ use Cosmologist \Bundle \SymfonyCommonBundle \Type \CallableType ;
6
+ use Twig \Extension \AbstractExtension ;
7
+ use Twig \TwigFilter ;
8
+ use Twig \TwigFunction ;
6
9
7
10
/**
8
- * Extension brings pre-configured list of functions and static class methods into Twig as filters and functions
11
+ * The extension provides various callable objects ( functions, method of static classes methods, methods of container services) to Twig templates.
9
12
*/
10
- class PhpExtension extends Twig_Extension
13
+ class PhpExtension extends AbstractExtension
11
14
{
12
15
/**
13
16
* @var array
14
17
*/
15
- private $ availableFunctions ;
18
+ private $ functions ;
16
19
17
20
/**
18
21
* @var array
19
22
*/
20
- private $ availableFilters ;
23
+ private $ filters ;
21
24
22
25
/**
23
- * @param array $availableFunctions
24
- * @param array $availableFilters
26
+ * @param array $functions
27
+ * @param array $filters
25
28
*/
26
- public function __construct (array $ availableFunctions , array $ availableFilters )
29
+ public function __construct (array $ functions , array $ filters )
27
30
{
28
- $ this ->availableFunctions = $ availableFunctions ;
29
- $ this ->availableFilters = $ availableFilters ;
31
+ $ this ->functions = $ functions ;
32
+ $ this ->filters = $ filters ;
30
33
}
31
34
32
35
/**
33
36
* {@inheritdoc}
34
37
*/
35
38
public function getFilters ()
36
39
{
37
- $ callbacks = $ this ->getCallbacks ($ this ->availableFilters );
38
-
39
- return
40
- \array_map (
41
- function ($ function , $ callback ) {
42
- return new \Twig_SimpleFilter ($ function , $ callback );
43
- },
44
- \array_keys ($ callbacks ), $ callbacks
45
- );
40
+ return $ this ->prepare ($ this ->filters , TwigFilter::class);
46
41
}
47
42
48
43
/**
49
44
* {@inheritdoc}
50
45
*/
51
46
public function getFunctions ()
52
47
{
53
- $ callbacks = $ this ->getCallbacks ($ this ->availableFunctions );
54
-
55
- return
56
- \array_map (
57
- function ($ function , $ callback ) {
58
- return new \Twig_SimpleFunction ($ function , $ callback );
59
- },
60
- \array_keys ($ callbacks ), $ callbacks
61
- );
48
+ return $ this ->prepare ($ this ->functions , TwigFunction::class);
62
49
}
63
50
64
51
/**
65
- * Build callbacks for callables from configuration
52
+ * Prepares callable objects defined in the application config for Twig
66
53
*
67
- * @param string|array $callables
54
+ * @param array $functions
55
+ * @param string $twigCallableClass
68
56
*
69
57
* @return array
70
58
*/
71
- private function getCallbacks ($ callables )
72
- {
73
- $ result = array ();
74
-
75
- foreach ($ callables as $ function ) {
76
-
77
- if (is_array ($ function ) && !is_numeric (key ($ function ))) {
78
- $ callback = current ($ function );
79
- $ function = key ($ function );
80
- } else {
81
- $ callback = $ function ;
82
- }
83
-
84
- $ result [$ function ] = $ callback ;
85
- }
86
-
87
- return $ result ;
88
- }
89
-
90
- /**
91
- * {@inheritdoc};
92
- */
93
- public function getName ()
59
+ protected function prepare (array $ functions , string $ twigCallableClass ): array
94
60
{
95
- return 'symfony_common_php_extension ' ;
61
+ return
62
+ array_map (
63
+ function ($ expression , $ name ) use ($ twigCallableClass ) {
64
+ return new $ twigCallableClass ($ name , CallableType::toCallable ($ expression ));
65
+ },
66
+ $ functions ,
67
+ array_keys ($ functions )
68
+ );
96
69
}
97
70
}
0 commit comments