簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM