Есть ли способ заставить Yii перезагрузить модульные активы по каждому запросу?
Мой сайт разделен на отдельные модули. Каждый модуль имеет собственные файлы css или js в файлах /protected/modules/my_module/assets/css
или js
для js файлов. Менеджер активов Yiis создает папку, когда я впервые использую страницу, использующую мои активы.
К сожалению, если я изменяю sth в своих файлах - Yii не перезагружает мой файл css или js. Мне нужно вручную удалить папку /projects/assets
. Это действительно раздражает, когда вы разрабатываете приложение.
Есть ли способ заставить Yii перезагрузить активы каждый запрос?
Ответы
Ответ 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
должно выполнить эту цель.
Ответ 2
Если вы используете Yii2, через конфигурацию есть гораздо более простое решение.
Добавьте в свой 'config/web.php'
следующее:
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
// ...
$config['components']['assetManager']['forceCopy'] = true;
}
Это заставляет AssetManager копировать все папки в каждом прогоне.
Ответ 3
Альтернативным решением является публикация ваших активов модуля следующим образом:
Yii::app()->assetManager->publish($path, false, -1, YII_DEBUG);
Четвертый параметр обеспечивает копирование ваших активов, даже если они уже опубликованы.
Подробнее см. В руководстве по publish().
Ответ 4
Переиздание активов по каждому запросу потенциально занимает много ресурсов и не обязательно для развития.
Возвратитесь только к одному из других решений, если по какой-то причине вы не можете использовать символические ссылки на своей машине разработки (не очень вероятно).
Ответ 5
В YII 1 в конфигурации мы имеем:
'components'=> [
...
'assetManager' => array(
'forceCopy' => YII_DEBUG,
...
)
...
]