【问题标题】:Phalcon\Mvc\View\Exception: Macro 'baseImagesURL' does not existPhalcon\Mvc\View\Exception: 宏 'baseImagesURL' 不存在
【发布时间】:2019-09-03 11:39:27
【问题描述】:

我在我的配置类中定义了一个共享服务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')}}" >

【问题讨论】:

    标签: php configuration phalcon phalcon-routing


    【解决方案1】:

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

    要了解如何做您想做的事,我们可以检查生成的使用常规 url 函数的 Volt 模板的编译代码。我们将看到在生成的 PHP 代码中{{url('foo.bar')}} 行被转换为:&lt;?= $this-&gt;url-&gt;get('foo.bar') ?&gt;(您可以在 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
    ]);
    

    【讨论】:

    • 感谢详细的回答伙伴。让我试一试。
    • 我试过上面的代码,但错误仍然存​​在。我想要的是定义一个可以存储路径的配置变量,然后所有电压视图都可以访问该路径。我在 phalcon 论坛上发布了这个问题,但正在等待一个好的答案forum.phalcon.io/discussion/19987/…
    • 我认为我没有 100% 理解你在说什么。你得到哪个错误? baseImagesURL() 功能还不够满足​​您的需求?如果需要,可以在模板内调用{{ baseImagesURL() }} 来获取配置变量的值。但通常,直接调用 baseImagesURL('my-file') 足以满足大多数资产服务需求。
    • @Iftikharuddin 我测试了上面的代码,它工作正常,我只是将我的示例推送到了一个 git repo。您可以在此处查看该项目:github.com/rpagliuca/phalcon-base-images-url。特别是,我想你会对这个文件感兴趣:github.com/rpagliuca/phalcon-base-images-url/blob/master/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2012-10-04
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多