Ganska dålig rubrik va? I vilket fall så stötte vi på ett tillfälle där vi ville köra kod innan en closure kördes. Vi vill alltså “prependa kod i en closure”. Just i det här fallet var det att vi ville köra funktionen newrelic_name_transaction för att kunna spåra en request innan routen körs i newrelic - utan att behöva lägga till koden i varje routes kod.

<?php
/* Såhär skapar vi en route exempelvis */
$routes[] = new Route('GET /index/@var1', function($var1) {
  echo 'Hello world! '.$var1;
});

/* Såhär ville vi inte göra */
$routes[] = new Route('GET /index/@var1', function($var1) {
    if(function_exists('newrelic_name_transaction')) {
        newrelic_name_transaction('GET /index/@var1');
    }
    echo 'Hello world! '.$var1;
});

/**
 * Såhär löste vi det
 */
class Route
{
    /* .. */
    function __construct($request, closure $functions, $weight = NULL)
    {
        $this->request = $request;
        $this->weight = $weight;

        $this->function = function (...$vars) use ($functions) {
            if(function_exists('newrelic_name_transaction')) {
                newrelic_name_transaction($this->request);
            }

            return $functions(...$vars);
        };
    }
    /* .. */
}