KernelEvents :: REQUEST tidak diaktifkan pada halaman yang di-cache


13

Saya mencoba menerapkan pelanggan acara KernelEvents :: REQUEST untuk melakukan beberapa tindakan pada pemuatan halaman.

Saya perlu acara ini untuk memecat terlepas dari apakah halaman yang diminta ada di cache Drupal - tampaknya KernelEvents :: REQUEST tidak menyala ketika Drupal menyajikan sesuatu dari cache.

Apakah ada acara yang dapat saya gunakan untuk mencapai hal ini, atau haruskah saya menerapkan persyaratan saya sebagai suatu bentuk middleware?


1
Acara PERMINTAAN harus dipicu, jika tidak, tidak akan ada respons. IMHO ES Anda memiliki bobot yang buruk dan layanan http_middleware.page_cache (atau cache halaman dinamis) menghentikan penyebaran acara lebih lanjut, maka ES Anda tidak akan terpicu.

Berat / prioritas ES diatur ke 20

Seperti yang ditulis 4k4, page_cache untuk pengguna anonim adalah middleware dan terjadi jauh sebelum acara REQUEST. Anda bisa menulis middleware Anda sendiri yang datang lebih awal, tetapi Anda mungkin ingin mempertimbangkan kembali penilaian Anda. Apa sebenarnya yang perlu terjadi begitu awal? Perlu diingat bahwa cache halaman anonim bahkan dapat terjadi dalam pernis perangkat lunak eksternal lainnya atau bahkan browser sendiri. Lihat bagaimana modul statistik inti melacak kunjungan halaman: Dengan javascript yang mem-ping server ketika pengguna menjalankannya.
Berdir

@Berdir Ini untuk memberikan autentikasi http untuk sebuah situs, mirip dengan modul Shield - jadi saya pikir ini mewakili contoh yang valid dari sesuatu yang perlu ditangani sedini mungkin dalam permintaan. (Saya sadar ada patch modul D8 Shield diimplementasikan sebagai middleware - Saya berasumsi karena keterbatasan ini).

Jawaban:


14

Cache dinamis berlangganan acara dengan prioritas 27. Jika Anda ingin kode Anda berjalan sebelum itu Anda harus menggunakan prioritas> 27:

  public static function getSubscribedEvents() {
    $events = [];

    // Run after AuthenticationSubscriber (necessary for the 'user' cache
    // context; priority 300) and MaintenanceModeSubscriber (Dynamic Page Cache
    // should not be polluted by maintenance mode-specific behavior; priority
    // 30), but before ContentControllerSubscriber (updates _controller, but
    // that is a no-op when Dynamic Page Cache runs; priority 25).
    $events[KernelEvents::REQUEST][] = ['onRequest', 27];

Yang menjalankan DynamicPageCacheSubscriber :: onRequest ..


Prioritas diatur ke 20

Saya pikir masalah yang Anda miliki adalah dengan kejadian dari cache dinamis, saya mengedit jawaban saya.
4k4

terima kasih @ 4k4, tetapi bahkan dengan prioritas yang diatur ke 30 masih berperilaku sama (saya menginstal ulang modul dan menghapus semua cache setelah melakukan perubahan). Ada ide lain?

Ada dua cache. Sekarang Anda memiliki prioritas di atas cache dinamis masih ada cache halaman. Tembolok halaman dijalankan sebelum kernel utama. Anda dapat menghapus modul ini dan menguji apakah kinerjanya OK tanpa itu.
4k4

Saya dapat mengkonfirmasi bahwa ini berhasil untuk saya. Saya memiliki arahan ulang yang hanya akan terjadi sekali - sebelum halaman di-cache. Ketika saya menambahkan prioritas ['checkForRediret', 30];maka itu berfungsi seperti yang diharapkan.
Cyclonecode

6

Drupal 8 memiliki dua level cache, cache halaman dan cache halaman dinamis.

Ya, Anda dapat mencegat cache halaman dinamis seperti yang disebutkan oleh @ 4k4. Masalah yang Anda hadapi lebih cenderung mencegat cache halaman. Kuncinya ada di sini .

Ada beberapa solusi untuk ini:

  1. Tambahkan kelas baru yang mengimplementasikan 'HttpKernelInterface' dan daftarkan 'http_middleware' dengan prioritas lebih tinggi dari 200 (280 akan melakukannya). Lihat kelas 'PageCache' dan implementasi untuk referensi.

  2. Buat kelas baru untuk mengubah 'PageCache' yang ada dengan memperluas dari 'ServiceProviderBase'. Lihat ini untuk referensi di sini . Kemudian, buat kelas baru untuk memperluas 'PageCache'.

Berikut ini adalah referensi kode:

Ini adalah StaticCacheServiceProvider.php:

/**
 * Modifies the language manager service.
 */
class StaticCacheServiceProvider extends ServiceProviderBase
{
  /**
   * {@inheritdoc}
   */
  public function alter(ContainerBuilder $container)
  {
    // Overrides language_manager class to test domain language negotiation.
    $definition = $container->getDefinition('http_middleware.page_cache');
    $definition->setClass('Drupal\your_module\StackMiddleware\StaticCache');
  }
}

Ini adalah StaticCache.php:

/**
 * Executes the page caching before the main kernel takes over the request.
 */
class StaticCache extends PageCache
{
  /**
   * {@inheritdoc}
   */
  public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true)
  {
    // do special logic here.

    $response = parent::handle($request, $type, $catch);

    return $response;
  }
}

Semoga bisa membantu.


Ini sangat membantu, terima kasih, saya memecahkan masalah dengan mengimplementasikan solusi 1.
Remco Hoeneveld
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.