有什么办法可以在Phalcon的每一个页面上添加资产吗?[英] Is there some way to add an asset to every single page in Phalcon?

问题描述

我正在阅读 Phalcon 的文档,试图找到一种利用 资产的方法Manager 默认情况下将 CSS 或 JS 文件添加到每个页面.我一直没有找到任何方法来做到这一点.

为整个控制器添加资产很容易通过以下方式完成:

public function initialize() {
    $this->assets->addCss('css/global.css');
}
  • 有什么方法可以默认为所有控制器添加资产?

我想到了覆盖基本控制器类然后让我的控制器扩展的想法,但这听起来有点草率,如果可能的话我想避免这种情况.

谢谢,感谢您的帮助.

推荐答案

到目前为止,在基本控制器中执行似乎是最好的方法,尽管我同意它确实闻起来有点草率.虽然感觉像 css 和 js 这样的资产应该是视图权限的一部分,不应该从其他地方触及,但在现实生活中这是不正确的.首先,您从控制器配置视图,指定其中的参数,并指定单个视图特定的资产等.没有理由不应该在基本控制器中提供 global.css.

我觉得唯一真正草率的是,有一个独立的视图和一个独立的资产管理器,实际上它们必须耦合在一起,并且您在特定视图上设置的资产必须仅与该视图相关.在某些情况下,您希望独立于其他所有内容呈现视图并从默认视图使用它自己的资产,例如在注册后呈现欢迎电子邮件模板.在当前的实现中,这只能通过覆盖相当多的逻辑来实现.

如果您不将样式压缩到单个文件中,您也可以直接在模板中附加该样式.您也可以尝试使用 assets.addCss('css/global.css') 直接在视图中添加资产 - 如果 volt 通过辅助函数执行此操作,这可能无法立即工作,在这种情况下您应该首先实现自己的.然而,这意味着向视图添加逻辑,这绝不是一件好事,除非你不能没有它.因此,请坚持使用基本控制器方法.

编辑:具有讽刺意味的是,一天后,我在使用一年多后发现通过 initialize() 事件处理程序执行此操作存在问题.

当您从一个控制器转发到另一个控制器时,您转发的控制器也会被初始化.这意味着相同的资产被添加了两次,如果它们被连接到一个文件中,天知道会发生什么……这对 css 来说不是问题(只是增加了大小),但是 JS 很可能会崩溃,通常没有任何迹象.使用控制器中的 afterExecuteRoute() 处理程序和调度程序状态检查很容易解决这个问题:

public function afterExecuteRoute()
{

    // If dispatcher hasn't finished dispatching we shouldn't enter.

    if (!$this->dispatcher->isFinished()) {
        return;
    }

    $this->assets->addCss('css/global.css');
}

在你的继承视图中,只需用这个覆盖它:

public function afterExecuteRoute()
{
    parent::afterExecuteRoute();

    if (!$this->dispatcher->isFinished()) {
        return;
    }

    $this->assets->addCss('css/custom.css');
}

本文地址:https://www.itbaoku.cn/post/1739791.html