Как я могу установить собственный класс Tag в Вольт (Phalcon)
Я хочу переопределить и добавить некоторые методы для вспомогательного тега.
class MyTags extends \Phalcon\Tag
{
public static function mytag($params)
{
<...>
}
}
в services.php
$di->set('tag', function() {
return new MyTags();
};
Но это работает только для движка PHP, а не для Volt.
{{ mytag() }}
возвращенный
Undefined function 'mytag'
1 ответ
Решение
Прежде всего: не используйте tag
как имя вашего сервиса, потому что он уже используется объектом Tag Phalcon. Во-вторых, вы можете использовать статические методы из класса.
Ниже приведен рабочий пример для myTag
используя конфигурацию из моего приложения с измененными именами для вашего примера.
$di->set(
'view',
function () use ($config) {
$view = new View();
$view->setViewsDir($config->application->viewsDir);
$view->registerEngines(
array(
'.volt' => function ($view, $di) use ($config) {
$volt = new VoltEngine($view, $di);
$volt->setOptions(
array(
'compiledPath' => $config->application->cacheDir,
'compiledSeparator' => '_',
'compileAlways' => false
)
);
$compiler = $volt->getCompiler();
// add a function
$compiler->addFunction(
'myTag',
function ($resolvedArgs, $exprArgs) {
return 'MyTags::mytag(' . $resolvedArgs . ')';
}
);
// or filter
$compiler->addFilter(
'myFilter',
function ($resolvedArgs, $exprArgs) {
return 'MyTags::mytag(' . $resolvedArgs . ')';
}
);
return $volt;
}
)
);
return $view;
},
true
);
Тогда вы можете использовать свой myTag()
функция в вольт просмотров.
Но если вы хотите использовать объект, не используйте статические методы:
class MyTags extends \Phalcon\Tag
{
/**
* Look no static keyword here
*/
public function mytag($params)
{
<...>
}
}
в сервисах используют объект:
$di->set('mahTag', function() {
return new MyTags();
};
а затем в вольт:
{{ mahTag.mytag() }}