Есть ли способ заставить 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,
...
)
...
]