雖說 phalcon 的 mvc 架構已經很方便了,可是有些情況如果可以在 volt (view)處理的話會方便許多,比方要將回傳的資料表格某欄位做處理才顯示,典型的例子是將 integer 資料用 bit string 的方式顯示。
方法有兩種,一個是在 service.php 中直接在 set view di 時加進去,例如下面的例子。
$di->set('view', function() use ($di) { $view = new \Phalcon\Mvc\View(); $view->setViewsDir(__DIR__ . '/views/'); $view->setLayoutsDir('/_layouts/'); $view->setLayout('default'); $view->registerEngines(['.phtml' => function($view, $di) { $volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di); $options = [ 'compiledPath' => $di->getConfig()->site->path->cache . 'volt/backend/', 'compiledExtension' => '.php', 'compileAlways' => $di->getConfig()->debug, ]; $volt->setOptions($options); // Extended functions $compiler = $volt->getCompiler(); $compiler->addFunction('in_array', 'in_array'); $compiler->addFunction('is_dir', 'is_dir'); $compiler->addFunction('getimagesize', 'getimagesize'); return $volt; }]); return $view; });
這種方式很適合直接用在 php built-in functions 上頭,但是如果是要自己寫的東西,就沒那麼方便,而且會讓整個 service.php 變得很冗長。比較建議的方式是直接 di 一個自訂 class 進去,這樣簡潔許多。
/* service.php */ $di->set('StringFunctions', function() { return new \StringFunctions(); }); /* StringFunctions.php */ <?php class StringFunctions extends \Phalcon\Tag { public static function IntToBitString($a) { return sprintf( "%08d", decbin( $a )); } } /* in volt file */ {{ StringFunctions.IntToBitString(IntVariable) }}