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

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

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

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

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

Ответ 5

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

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

]