Вы здесь

Как сбросить кеш из своего модуля?

1

Есть некоторые обстоятельства, из-за которых я не использую admin_menu (в котором есть пункт сбросить кеш), его аналог в Drupal 8 admin_toolbar.

О причинах могу рассказать отдельно. Поэтому я сделал свое админ меню, и вроде все ок, да только вот не получается сделать пункт меню "Сбросить кеш".

В седьмом друпале пункт моего меню ссылался на УРЛ Devel'a, сбрасывающий кеш: /devel/cache/clear, я дописывал туда destination, и все работало прекрасно. Но в девеле для восьмерки этот урл не работает. Однако схема с урлом из девела не очень хорошая - потому что это зависимость от другого модуля, а на проде девел вообще должен быть отключен (но скидывать кеш на продакшене при этом все равно часто нужно).

Поэтому, решил реализовать свой УРЛ для скидывания кеша но пока не получилось.
Урл такой: /clear_cache
По задумке, при посещении урла, модуль должен очищать кеш и перекидывать юзера обратно на страницу, с которой он зашел на "урл скидывания кеша". То есть страницу скидывания кеша юзер вообще не должен видеть. С его точки зрения выглядит так: нажал на пункт меню "скинуть кеш", страница задумалась и обновилась (при этом на сервере должен произойти переход на страницу модуля и редирект обратно)

Роутинг: \modules\custom\click_admin_menu\click_admin_menu.routing.yml

click_admin_menu.clear_cache:
  path: '/clear_cache'
  defaults:
    _controller: '\Drupal\click_admin_menu\Controller\ClickAdminMenuController::myPage'
    _title: 'Очистка кеша'
  requirements: 
    _permission: 'access content'

Контроллер: \modules\custom\click_admin_menu\src\Controller\ClickAdminMenuController.php

<?php

namespace Drupal\click_admin_menu\Controller;

/**
 * Provides route responses for the Example module.
 */
class ClickAdminMenuController {
  /**
   * Returns a simple page.
   *
   * @return array
   *   A simple renderable array.
   */

    public function myPage() {

        drupal_flush_all_caches(); // срабатывает только один раз

        if(isset($_SERVER['HTTP_REFERER'])){

            header('Location: '.$_SERVER['HTTP_REFERER']); // срабатывает только один раз

            $element = array(
                '#markup' => ' HTTP  '.$_SERVER['HTTP_REFERER'],
            );

        } else {

            $element = array(
              '#markup' => ' нету referera ',
            );
        }
        return $element;
    }
}

Сейчас при посещении страницы /clear_cache, кеш скидывается, и редирект тоже происходит (как и надо) но всего один раз! Пробовал передавать параметр ?destination=path но это не меняет дела. Ощущение такое, будто сама страница (результат ее работы) кешируется и работает данный модуль ровно один раз после скидывания кеша. Может мне нужен не колбек страницы а какой-то другой колбек? Или отключить кеш для самой этой страницы?

zip-архив модуля здесь: https://drive.google.com/file/d/0B7237kg-CPlCX01OWXowaFRoZGc/view?usp=sh...

Версия Drupal: 
8.x
Вопрос задан 01.05.2016 - 14:21

Ответы

0

Как то так должно быть

\modules\custom\click_admin_menu\src\Controller\ClickAdminMenuController.php

<?php

namespace Drupal\click_admin_menu\Controller;

use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;

class ClickAdminMenuController extends ControllerBase {

  public function clearCache(Request $request) {
    // Получаем урл реферера.
    $referer = $request->headers->get('referer');
    // Чистим кеш.
    drupal_flush_all_caches();
    // Выводим при необходимости сообщение.
    drupal_set_message($this->t('Cache cleared.'));
    // Выполняем редирект.
    return $referer ? new RedirectResponse($referer) : $this->redirect('<front>');
  }
}
Ответ дан 01.05.2016 - 16:59
Аватар пользователя drupby
drupby
450

Спасибо огромное! Работает все так как и нужно было! :)
Жаль, что пока пишу модули высоконаучным методом "Copy&Paste from StackOverflow" не особо понимая сути, но надеюсь со временем научусь.

Комментарий оставлен 01.05.2016 - 21:33