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: Drupal\mymodule\EventSubscriber\PageExit
tags:
- {name: event_subscriber}
/mymodule/src/Event/Subscriber/PageExit.php
namespace Drupal\mymodule\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
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?
hook_exit(line 82 of statistics.module). Is usinghook_exitfor this purpose in 7.x unreliable?