- getProxy()
- getClassName()
- getMethodName()
- getMethodArguments()
- getMethodArgument($argumentName)
- isMethodArgument($argumentName)
- getAdviceChain()
- getException()
- getResult()
Im Falle des Profilers bietet es sich an, einen Around advice zu definieren, der das Ergebnis seiner Zeitmessung in ein Logfile schreibt. Zuvor muss jedoch erst ein geeigneter Logger eingebunden werden – idealerweise im Konstruktor des Aspekts:
/**
* @var F3::FLOW3::Log::LoggerInterface Instanz des Loggers
*/
protected $logger;
/**
* Konstruktor-Methode des Aspekts
*
* @param F3::FLOW3::Log::LoggerInterface $logger: Instanz eines Loggers
* @return void
*/
public function __construct(F3::FLOW3::Log::LoggerInterface $logger) {
$this->logger = $logger;
}
Listing 4
FLOW3 erkennt hierbei die Typendeklaration „F3::FLOW3::Log::LoggerInterface“ des Parameters „$logger“ und versucht automatisch eine Instanz dieses Typs zu übergeben. Letztendlich kann nun der Advice definiert werden:
/**
* @around F3::SomePackage::ProfilingAspect->allMethodsInPackagePointcut
*/
public function profileMethods(F3::FLOW3::AOPJoinPointInterface $joinPoint) {
$beforeTime = microtime(true);
$result = $joinPoint->getAdviceChain()->proceed($joinPoint);
$proceedTime = microtime(true) - $beforeTime;
$this->logger->log('Method Execution Time: ' . $joinPoint->getMethodName() . ' of Class '.$joinPoint->getClassName().' took '.$proceedTime.'ms');
return $result;
}
Listing 5
Unter der Haube
FLOW3 verwendet für sein AOP-Framework [2] weder PHP-Extensions, die zusätzlich installiert werden müssen, noch einen Pre-Processor, sondern ausschließlich reines PHP. Dabei wird intensiv auf die Reflection-Klasse zurückgegriffen, um Aspekte, Pointcuts und Advices zu erkennen. FLOW3 erzeugt dann eine Unterklasse der Zielklasse in Form eines dynamischen Proxys. Dieser implementiert eine Methode zum Abfangen von Funktionsaufrufen, auf die ein bestimmter Advice angewandt werden soll. Diese Proxyklasse wird automatisch vom Framework erzeugt und gecached.




