【问题标题】:Is there some way to add an asset to every single page in Phalcon?有没有办法在 Phalcon 的每个页面上添加一个资产?
【发布时间】:2015-04-22 19:47:32
【问题描述】:

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

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

public function initialize() {
    $this->assets->addCss('css/global.css');
}
  • 是否可以通过某种方式将资产默认添加到所有控制器?

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

谢谢,感谢您的帮助。

【问题讨论】:

    标签: php phalcon


    【解决方案1】:

    您还可以在 DI 中操作资产管理器。

    $di->setShared("assets", function() {
    
        $assetManager = new \Phalcon\Assets\Manager();
        $assetManager->addJs('/path/to/some/js/file');
    
        return $assetManager;
    
    });
    

    这将确保始终加载 js 文件。您可以将配置传递给它以使其动态化。在运行 $app->handle()->getContent(); 之前,只需在 index.php 中的某个位置注册它即可。

    【讨论】:

      【解决方案2】:

      到目前为止,在基本控制器中执行此操作似乎是最好的方法,尽管我同意它确实闻起来有点马虎。虽然感觉像 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');
      }
      

      【讨论】:

      • 感谢您的反馈。我想您已经确认扩展基本控制器是我唯一的选择。由于我不想在视图中添加任何不必要的逻辑,看起来我将扩展基本控制器!谢谢!
      • 哇,太讽刺了,哈哈。我没有想到……很好。感谢您提供更新的答案,不胜感激。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      相关资源
      最近更新 更多