[英]Phalcon\Mvc\View\Exception: Macro 'baseImagesURL' does not exist
我在配置類中定義了共享服務baseImagesURL
,但是當我嘗試在伏特中使用它時,會引發此錯誤Phalcon\\Mvc\\View\\Exception: Macro 'baseImagesURL' does not exist
/**
* This service helps in the setting base images folder URL
*/
$di->setShared('baseImagesURL', function() use ($di) {
/** @var Config $config */
$config = $di->get('config');
$url = new Url();
$url->setStaticBaseUri( $config->path("environment.baseImagesUri"));
return $url;
});
伏特:
<img src="{{baseImagesURL('Sale-big.jpg')}}" >
默認情況下,Volt已經具有一個稱為url
的函數,該函數可用於處理所需的內容。 我假設您已經熟悉url
函數,因此我想您正在使用一個不同的名稱( baseImagesURL
),因為您希望兩個函數同時在模板引擎中以不同的基本URI配置同時可用。
為了找出您想做什么,我們可以檢查使用常規url
函數的Volt模板的生成的編譯代碼。 我們將看到行{{url('foo.bar')}}
被翻譯為: <?= $this->url->get('foo.bar') ?>
在生成的PHP代碼中(您可以在您的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(),以向您展示它們都按預期工作。 對於此演示,我配置了url
服務,幾乎與baseImagesURLService相同,但硬編碼路徑除外:
$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
]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.