默认情况下,Volt 已经有一个名为url 的函数,可以用来处理你想要的。我假设您已经熟悉 url 函数,所以我想您使用的是不同的名称 (baseImagesURL),因为您希望在模板引擎中同时使用这两个函数,并具有不同的基本 URI 配置。
要了解如何做您想做的事,我们可以检查生成的使用常规 url 函数的 Volt 模板的编译代码。我们将看到在生成的 PHP 代码中{{url('foo.bar')}} 行被转换为:<?= $this->url->get('foo.bar') ?>(您可以在 Phalcon 应用程序的 cache/ 目录中找到此编译文件)。
知道了这一点,我们可以做同样的事情并创建一个名为baseImagesURL 的新函数以供使用。首先,我们必须创建一个新服务,就像您在问题中所做的那样:
$di->setShared('baseImagesURLService', function () {
$url = new UrlResolver();
$url->setBaseUri('/tmp2/');
$url->setStaticBaseUri('/tmp2/');
return $url;
});
以上内容与您在问题中的内容类似,但我已经简化了一点,将基本 URI 硬编码。
创建此服务后,您可以添加一个新的 Volt 函数:
$volt->getCompiler()->addFunction(
'baseImagesURL',
function ($url) {
return '$this->baseImagesURLService->get(' . $url . ');';
}
);
现在,我们准备在 Volt 模板中使用新功能:
{{ url('foo.bar') }}
<br/>
{{ baseImagesURL('foo.bar') }}
以上将导致:
/tmp/foo.bar
/tmp2/foo.bar
如您所见,我在同一个模板中同时使用了 url() 和 baseImagesURL(),以向您展示两者都按预期工作。对于这个演示,我配置了与 baseImagesURLService 几乎相同的 url 服务,除了硬编码的路径:
$di->setShared('url', function () {
$url = new UrlResolver();
$url->setBaseUri('/tmp/');
$url->setStaticBaseUri('/tmp/');
return $url;
});
PS - 我仅将服务命名为 baseImagesURLService(冗余名称)以明确区分服务名称和 Volt 函数名称(baseImagesURL)。当然,您可以为两者使用相同的名称。
PS2 - 确保您已将 Volt 配置为始终重新编译您的模板。如果没有,函数 baseImagesURL 将不可用,并会触发您已经遇到的相同错误(未找到宏)。示例:
$volt->setOptions([
'compiledPath' => $config->application->cacheDir,
'compiledSeparator' => '_',
'compileAlways' => true
]);