PHP: Få kod att exekveras innan en closure
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);
};
}
/* .. */
}