Здравствуйте, есть не большая проблема.
При отправке формы, я обновляю поле в таблице на новое значение, но при обновление страницы, он получается старое значение, и только после сброса кэша, он получает новое значение.
Как при обращение к БД не использовать кэш?
Обращение к БД:
<?php
$connection = Database::getConnection();
$result = null;
try {
$query = $connection->select('ms_table', 'msu');
$query->fields('msu', ['type']);
$query->condition('id', 22);
$result = $query->execute()->fetchObject();
} catch (Exception $e) {
drupal_set_message($e->getMessage(), 'error');
}
?>
Комментарии
В таких случаях лучше не использовать прямые запросы к БД.
Пользуйтесь хранилищем сущностей и entityQuery()
Я не смог найти где бы понятно объяснилось как с этим работать
а как искали?
Через поисковик. Почему все время пытаетесь подколоть человека, который не смог найти нужную информацию? Я смог найти только статью где хорошо рассказали про прямые запросы к БД, поэтому им и воспользовался.
Я ещё никого не подкалывал!!!
А почему вы думаете, что кто-то должен за вас правильно поискать?
Хоть бы спасибо сказали вообще что вам кто-то ответил!
Вам так-то никто не обязан ничем.
А спросил я потому что на эту тему информации просто вагон и всё гуглится элементарно.
Какой запрос написали в поисковик?
Ваш вопрос ввел к этому.
Я не сказал, что я не благодарен Вам за подсказку в данной проблеме.
Как только я бы нашел нужную информацию, я бы Вас поблагодарил.
Как я понимаю форум для этого и создан, чтобы люди помогали друг другу.
И нет я не прошу и не хочу, чтобы люди вместо меня, что-то делали.
Просто может у кого-то есть ссылка на хорошую статью про данную тему.
А с чего ты взял, что это энтити?
база данных не имеет отношения к кешу
это кешируется страница
поставьте себе уже отладчик и посмотрите, если данные не обновились, то это потому что этот код не выполнялося
А если страница кэшируется, то как это избежать?
Она и должна кешироваться!
настраивать кеширование, сбрасывать кештеги
Devel (module)
kint
dpm
dsm
Вот то что нужно для отладки
Скорее всего страница кэшируется(как и выше было сказано)
можно так же чистить кэш в коде
\Drupal::service('NAME.CACHE')->invalidateAll()
Где name.cache это одно из
cache.bootstrap
cache.config
cache.data
cache.default
cache.discovery
cache.entity
cache.menu
cache.render
cache.static
Как работать с кэшами, тегами и проверять их хорошо описано здесь
https://pantheon.io/docs/guides/drupal-8-advanced-page-cache
Спасибо за подсказку, но что-то я не до конца понимаю.
Сначала я попробовал вот так:
<?php
$renderable = [
public function content(Request $request) {
\Drupal::service('cache_tags.invalidator')->invalidateTags(['my_custom_tag']);
'#theme' => 'template',
'#cache' => [
'tags' => ['my_custom_tag'],
],
];
return
$renderable;}
?>
И вроде как в некоторых случаях срабатывает, данные тут же подтягиваются.
Но сейчас опять проблема, он опять кэширует страницу, и данные не обновляются.
У меня модуль работает с Backend по Soap, и получается, что я отправляю по Soap новую информацию, и модуль должен получить новое значение, но он не получает, т.к. все кэшируется.
Попробовал так же вот это:
<?php
\Drupal::service('cache.entity')->invalidateAll();
?>
Но все равно не работает.
Проверь точно ли получаешь новые данные, можно в журнал писать
\Drupal::logger('my_module')->notice($message);
еще некоторые сервера настроены на кэширования запросов или кеширования скриптов, поэтому теоретично может быть проблема на уровне сервера(на шаред обычно этого нет)
Он в журнал записал только один раз, после перезагрузки страницы больше не записывает, как будто он даже не проходится снова по коду PHP в методе content
Значит и не проходит!
Кэши в настройках друпала стоят?
Если Вы про это https://prnt.sc/v7plm5, то да.
Думаю в этом проблема и есть, если анонимный юзер запускает обновление данных.
Обход вижу обработку данных через js
Можно получать данные через ajax страницы которая не кэшируется
а если так?
<?phpmymodule.myroute:
path: '/mymodule/mypage'
defaults:
_controller: '\Drupal\mymodule\Controller\Pages::mypage'
_title: 'No cache page'
requirements:
_access: 'TRUE'
options:
no_cache: 'TRUE'?>