我正在阅读Phalcon的文档,试图找到一种利用Assets Manager默认情况下将CSS或JS文件添加到每个页面的方法。我找不到任何方法都没有成功。
通过执行以下操作可轻松完成为整个控制器添加资产:
public function initialize() {
$this->assets->addCss('css/global.css');
}
重写基础控制器类然后让我的控制器扩展的想法改为想到了,但这听起来有点草率,我想尽可能避免这种情况。
谢谢,感谢您的帮助。
答案 0 :(得分:1)
到目前为止,在基本控制器中进行此操作似乎是最好的方法,但我同意它确实闻起来有点草率。虽然它认为像css和js这样的资产应该成为观察权威的一部分而不应该被其他地方所触动,但在现实生活中这是不正确的。首先,您可以从控制器配置视图,指定其中的参数,并指定各个视图特定的资产等。没有理由不提供global.css
它在基本控制器中。
我发现唯一真正草率的是,有一个独立的视图,并且有一个独立的资产管理器,实际上必须将它们耦合在一起,并且您在特定视图上设置的资产必须仅与该视图相关。在某些情况下,您希望独立于其他所有内容呈现视图,并在默认视图中使用它自己的资源,例如在注册后呈现欢迎电子邮件模板。通过当前的实现,只有通过覆盖相当多的逻辑才能实现这一点。
或者,如果您不将它们缩小为单个文件,则可以直接在模板中附加该样式。您还可以尝试使用assets.addCss('css/global.css')
直接在视图中添加资源 - 如果伏特通过辅助函数执行此操作,这可能无法正常工作,在这种情况下,您应首先实现自己的操作。然而,这意味着为视图添加逻辑,除非你没有它,否则它永远不会是一件好事。所以,坚持使用基本控制器方法。
编辑:具有讽刺意味的是,一天后我发现在使用它超过一年后通过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');
}