はじめて質問させていただきます。どうぞよろしくお願いいたします。
テンプレートエンジンの Twig 上で PHP の組み込み関数を使用できるようにするため、
(方法は複数あるようですが)こちらなどを参考に、次のようなコードを書きました。
↓index.twig↓
html
1<html> 2<head> 3 <meta charset="UTF-8"> 4 <title>{{ title }}</title> 5</head> 6<body> 7 <h1>welcome to {{ message }}</h1> 8 <h2>welcome to {{ substr(message, 0, -6) }}</h2> 9 <h2>welcome to {{ str_replace('ground', 'place', message)}}</h2> 10</body> 11</html>
↓tiwg_test.php↓
php
1<?php 2require_once './vendor/autoload.php'; 3 4$loader = new Twig_Loader_Filesystem('./views/'); 5$twig = new Twig_Environment($loader); 6 7$twig->registerUndefinedFunctionCallback(function ($name) { 8 if (function_exists($name)) { 9 return new Twig_SimpleFunction($name, $name); 10 } 11 12 return false; 13}); 14 15echo $twig->render('index.twig', array( 16'title' => 'Twig Test', 17'message' => 'underground' 18));
これによって、以下の結果を得ることができました。
ただ、不明な点があります。
###registerUndefinedFunctionCallback() はいったい何をしているのか?
Twig_Environment クラスが書かれている Environment.php を確認すると、次のようになっていました。
php
1public function registerUndefinedFunctionCallback($callable) 2{ 3 $this->functionCallbacks[] = $callable; 4}
$functionCallbacks はクラス内で、
protected $functionCallbacks = array();
と宣言されています。
クラス内で $functionCallbacks が他に出てくるのは、以下の関数のみです(一番最後の foreach 文)。
php
1public function getFunction($name) 2{ 3 if (!$this->extensionInitialized) { 4 $this->initExtensions(); 5 } 6 7 if (isset($this->functions[$name])) { 8 return $this->functions[$name]; 9 } 10 11 foreach ($this->functions as $pattern => $function) { 12 $pattern = str_replace('\*', '(.*?)', preg_quote($pattern, '#'), $count); 13 14 if ($count) { 15 if (preg_match('#^'.$pattern.'$#', $name, $matches)) { 16 array_shift($matches); 17 $function->setArguments($matches); 18 19 return $function; 20 } 21 } 22 } 23 24 foreach ($this->functionCallbacks as $callback) { 25 if (false !== $function = call_user_func($callback, $name)) { 26 return $function; 27 } 28 }
この getFunction() はクラス内では呼ばれていません。
コンストラクタ(必要であれば記載します)も確認しましたが、getFunction() や $functionCallbacks に結びつくものは現状見つけることができていません(そもそもコードの読み方がおかしいでしょうか?)。
registerUndefinedFunctionCallback() は、いったいどのようにして index.twig から PHP の組み込み関数を読み取って、Twig で使えるようにしているのでしょうか?
また、初歩的な質問になってしまうかもしれませんが、
php
1$twig->registerUndefinedFunctionCallback(function ($name) { 2 if (function_exists($name)) { 3 return new Twig_SimpleFunction($name, $name); 4 }
上記のコールバック関数の引数となっている $name はどこからやってくるのでしょうか?
以上の 2 点について、ご回答をいただけましたら幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/06/10 09:29
2018/06/10 13:27
退会済みユーザー
2018/06/11 12:26
退会済みユーザー
2018/06/11 12:30
退会済みユーザー
2018/06/11 12:44
退会済みユーザー
2018/06/11 12:45
退会済みユーザー
2018/06/11 12:48
2018/06/11 15:52