Есть ли способ заставить Yii перезагружать активы модуля по каждому запросу?

мой сайт разделен на отдельные модули. Каждый модуль имеет свои собственные файлы css или js в /protected/modules/my_module/assets/css или js для файлов js. Yiis assets manager создает папку при первом использовании страницы, которая использует мои активы. К сожалению, если я изменю sth в своих файлах - Yii не перезагрузит мой css или JS-файл. Я должен вручную удалить . Это действительно раздражает, когда вы разрабатываете приложение.

есть ли способ заставить Yii перезагружать активы каждый запрос?

5 ответов


на 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

Я не тестировал это, но на основе документации I поверьте, это должно работать нормально.

Примечание: размещение этого кода в beforeAction - это просто пример того, куда его поместить. Вам просто нужно установить forceCopy свойство true перед любыми вызовами publish(), и поместив его в 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);

четвертый параметр задает копирование ваших активов, даже если они уже опубликованы. См. руководство по публикации() для сведения.


повторная публикация активов по каждому запросу потенциально занимает много ресурсов и не является необходимой для разработки.

  • для разработки гораздо проще использовать linkAssets характеристика CClientScript. Активы публикуются как каталоги символических ссылок, и никогда не нужно регенерировать. Видеть: http://www.yiiframework.com/doc/api/1.1/CAssetManager#linkAssets-detail

  • для постановки / производства вы должны очистить активы / папка часть процедуры/сценария обновления.

только для одного из других решений, если по каким-то причинам вы не можете использовать символические ссылки на вашей машине разработки (не очень вероятно).


в YII 1 в конфигурации имеем:

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

]