有没有办法迫使Yii的重新加载在每次请求模块的资产?(Is there a way to force

2019-08-17 23:48发布

My website is divided into separate modules. Every module has it's own specific css or js files in /protected/modules/my_module/assets/css or js for js files. Yiis assets manager creates folder when I first use page that uses my assets. Unfortunately if I change sth in my files - Yii does not reload my css or js file. I have to manually delete /projects/assets folder. It is really annoying when you are developing the app.

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

Answer 1:

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只是把它放在哪里的例子。 您只需设置forceCopy属性为true任何调用之前publish()并把它放在beforeAction应实现这一目标。



Answer 2:

如果您使用Yii2有通过配置一个更简单的解决方案。

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

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

这迫使AssetManager到所有文件夹复制每次运行。



Answer 3:

一个或者解决方案是发布模块的资产是这样的:

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

第四个参数强制执行资产的副本,即使他们在那里已经发布。 参见手册出版)(了解详情。



Answer 4:

在每次请求重新发布资产可能需要大量的资源,是unnessecary发展。

  • 为了发展,它更容易使用linkAssets CClientScript的功能。 资产被公布为符号链接的目录,并从来没有被再生。 请参阅: http://www.yiiframework.com/doc/api/1.1/CAssetManager#linkAssets-detail

  • 对于分期/生产,你应该清除更新程序/脚本的资产/文件夹的一部分。

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



Answer 5:

在YII 1中配置有:

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

]


文章来源: Is there a way to force Yii to reload module assets on every request?