是否有一种方法可以强制Yii在每次请求时重新加载模块资产?


Is there a way to force Yii to reload module assets on every request?

我的网站分为不同的模块。每个模块在/protected/modules/my_module/assets/cssjs中都有自己特定的css或js文件。当我第一次使用使用我的资产的页面时,我的资产管理器会创建文件夹。不幸的是,如果我改变了我的文件- Yii不重新加载我的css或js文件。我必须手动删除/projects/assets文件夹。当你在开发应用程序时,这真的很烦人。

是否有一种方法可以强制Yii每次请求都重新加载资产?

components/Controller.php中添加以下内容(或调整现有的beforeAction):

protected function beforeAction($action){
    if(defined('YII_DEBUG') && YII_DEBUG){
        Yii::app()->assetManager->forceCopy = true;
    }
    return parent::beforeAction($action);
}

在任何操作开始之前,应用程序将检查您是否处于调试模式,如果是,将设置资产管理器强制在每次页面加载时重新复制所有资产。

见:http://www.yiiframework.com/doc/api/1.1/CAssetManager forceCopy-detail

我还没有测试过,但是根据文档,我相信它应该工作得很好。

注意:该代码在beforeAction中的位置只是放置它的一个示例。您只需要在调用publish()之前将forceCopy属性设置为true,并将其放在beforeAction中应该可以实现该目标。

如果您使用的是Yii2,那么通过配置有一个简单得多的解决方案。

将以下内容添加到您的'config/web.php':

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    // ...
    $config['components']['assetManager']['forceCopy'] = true;
}

这将强制AssetManager在每次运行时复制所有文件夹

另一种解决方案是像这样发布模块资产:

Yii::app()->assetManager->publish($path, false, -1, YII_DEBUG);

第四个参数强制您的资产的副本,即使它们已经发布。

请参阅有关publish()的手册。

对每个请求重新发布资产可能会占用大量资源,并且对于开发来说是不必要的。

  • 对于开发,使用的linkAssets特性要容易得多CClientScript。资产作为符号链接目录发布,并且永远不需要再生。看到的:http://www.yiiframework.com/doc/api/1.1/CAssetManager linkAssets-detail

  • 对于登台/生产,您应该清除资产/文件夹

如果由于某种原因不能在开发机器上使用符号链接(不太可能),则只能退回到其他解决方案之一。

在配置中我们有:

'components'=> [
...
 'assetManager' => array(
            'forceCopy' => YII_DEBUG,
...
)
...
]