Php Phalcon\Mvc\View\Exception:宏“baseImagesURL”不存在

Php Phalcon\Mvc\View\Exception:宏“baseImagesURL”不存在,php,configuration,phalcon,phalcon-routing,Php,Configuration,Phalcon,Phalcon Routing,我在我的配置类中定义了一个共享服务BaseMageSurl,但当我尝试在volt中使用它时,它会抛出以下错误:宏“BaseMageSurl”不存在 伏特: 默认情况下,Volt已经有一个名为url的函数,可以用来处理您想要的内容。我假设您已经熟悉url函数,因此我假设您使用的是不同的名称baseImagesURL,因为您希望在模板引擎中同时使用这两个函数,并使用不同的基本URI配置 为了了解如何做您想做的事情,我们可以检查使用常规url函数的Volt模板生成的编译代码。我们将看到{url'foo

我在我的配置类中定义了一个共享服务BaseMageSurl,但当我尝试在volt中使用它时,它会抛出以下错误:宏“BaseMageSurl”不存在

伏特:


默认情况下,Volt已经有一个名为url的函数,可以用来处理您想要的内容。我假设您已经熟悉url函数,因此我假设您使用的是不同的名称baseImagesURL,因为您希望在模板引擎中同时使用这两个函数,并使用不同的基本URI配置

为了了解如何做您想做的事情,我们可以检查使用常规url函数的Volt模板生成的编译代码。我们将看到{url'foo.bar'}行被翻译为:在生成的PHP代码中,您可以在Phalcon应用程序的cache/dir中找到这个编译文件

知道了这一点,我们可以做同样的事情,创建一个名为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') }}
正如您所看到的,我在同一个模板中使用了url和BaseMageSurl,以向您展示它们都按照预期工作。对于本演示,我已将url服务配置为与BaseMageSurlService几乎相同,除了硬编码路径:

$di->setShared('url', function () {   
    $url = new UrlResolver();
    $url->setBaseUri('/tmp/');
    $url->setStaticBaseUri('/tmp/');
    return $url;
});
PS-我仅将服务BaseMageSurlService命名为冗余名称,以明确区分服务名称和Volt函数名称BaseMageSurl。当然,您可以对这两个名称使用相同的名称

PS2-确保已将Volt配置为始终重新编译模板。否则,函数baseImagesURL将不可用,并将触发您已经遇到的相同错误“未找到宏”。例如:

$volt->setOptions([
    'compiledPath' => $config->application->cacheDir,
    'compiledSeparator' => '_',
    'compileAlways' => true
]);

谢谢你的详细回答,伙计。让我试试。我试过上面的代码,但错误仍然存在。我想要的是定义一个可以存储路径的配置变量,然后所有volt视图都可以访问该路径。我在phalcon论坛上发布了这个问题,但在等待一个好的答案时,我不认为我100%理解你说的话。你犯了什么错误?baseImagesURL功能不足以满足您的需要?如果需要,可以在模板内调用{{baseImagesURL}},以获取配置变量的值。但通常,直接调用baseImagesURL'my-file'就足以满足大多数资产服务需求。@Ifikharuddin我测试了上述代码,它工作正常,我只是将我的示例推到git repo上。您可以在此处签出该项目:。特别是,我认为您会对以下文件感兴趣:
/tmp/foo.bar
/tmp2/foo.bar
$di->setShared('url', function () {   
    $url = new UrlResolver();
    $url->setBaseUri('/tmp/');
    $url->setStaticBaseUri('/tmp/');
    return $url;
});
$volt->setOptions([
    'compiledPath' => $config->application->cacheDir,
    'compiledSeparator' => '_',
    'compileAlways' => true
]);