Php 有没有办法在Phalcon的每个页面上添加一个资产?

Php 有没有办法在Phalcon的每个页面上添加一个资产?,php,phalcon,Php,Phalcon,我正在阅读Phalcon的文档,试图找到一种在默认情况下利用添加CSS或JS文件到每个页面的方法。我一直没有找到做这件事的任何方法 通过执行以下操作,可以轻松地为整个控制器添加资源: public function initialize() { $this->assets->addCss('css/global.css'); } 是否有某种方法可以在默认情况下将资源添加到所有控制器 我想到了覆盖基本控制器类,然后让我的控制器扩展它的想法,但这听起来有点草率,如果可能的话

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

通过执行以下操作,可以轻松地为整个控制器添加资源:

public function initialize() {
    $this->assets->addCss('css/global.css');
}
  • 是否有某种方法可以在默认情况下将资源添加到所有控制器
我想到了覆盖基本控制器类,然后让我的控制器扩展它的想法,但这听起来有点草率,如果可能的话,我希望避免这种情况


谢谢,感谢您的帮助。

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

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

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

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

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

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');
}

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

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

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

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

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

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');
}

您还可以在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中的某个地方注册它

您还可以在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中的某个地方注册它

谢谢你的反馈。我想您已经确认扩展基本控制器是我唯一的选择。因为我不想在视图中添加任何不必要的逻辑,所以看起来我将是exte