In Drupal 7 hook_exit
is implemented in the Statistics module to gather statistics for page accesses. This change record suggest the equivalent in Drupal 8 is to listen for kernel.terminate events. Here’s my code:
/mymodule/mymodule.services.yml
services: mymodule.page_exit: class: DrupalmymoduleEventSubscriberPageExit tags: - {name: event_subscriber}
/mymodule/src/Event/Subscriber/PageExit.php
namespace DrupalmymoduleEventSubscriber; use SymfonyComponentEventDispatcherEventSubscriberInterface; use SymfonyComponentHttpKernelKernelEvents; use SymfonyComponentHttpKernelEventPostResponseEvent; class PageExit implements EventSubscriberInterface { /** * {@inheritdoc} */ static function getSubscribedEvents() { $events[KernelEvents::TERMINATE][] = array('logAccess'); return $events; } /** * Call this method whenever the KernelEvents::TERMINATE event is dispatched. */ public function logAccess(PostResponseEvent $event) { // $access_info = $event->getRequest() Drupal::database()->insert('mymodule_table') ->fields(array( 'hostname' => '?', 'referrer_url' => '?', 'timestamp' => REQUEST_TIME, )) ->execute(); } }
Currently, for a single page request, the method logAccess
gets called five times. I’m interested in logging the hostname and referrer url of my page visitor, just once.
In essence, I’m trying to port some of this this Drupal 7 code from statistics_exit in statistics.module:
drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION); // For anonymous users unicode.inc will not have been loaded. include_once DRUPAL_ROOT . '/includes/unicode.inc'; // Log this page access. db_insert('accesslog') ->fields(array( // 'title' => truncate_utf8(strip_tags(drupal_get_title()), 255), // 'path' => truncate_utf8($_GET['q'], 255), 'url' => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '', 'hostname' => ip_address(), // 'uid' => $user->uid, // 'sid' => session_id(), // 'timer' => (int) timer_read('page'), 'timestamp' => REQUEST_TIME, )) ->execute();
Any ideas?