どの関数がアクセスされたかをログに記録するためだけです。各関数でログ関数を呼び出す代わりに。
メソッドにコードを追加したり、デバッグとプロファイリング用の別のツールを使用したりしない限り、これは簡単には不可能です。
提案されたソリューションは__call
、既存のパブリック メソッドでは機能しないことに注意してください。最終的には、log(__METHOD__)
各メソッドに追加するよりも複雑になります。
あなたが探しているのは、基本的に PHP でひどくサポートされていないAspect Oriented Programming (AOP)です。フレームワーク Flow3 は、アノテーションとリフレクションを使用してアスペクトを動的に追加します。Logging Exampleは、ユースケースの完璧な例です。
namespace Example\MyPackage;
/**
* A logging aspect
*
* @Flow\Aspect
*/
class LoggingAspect {
/**
* @var \TYPO3\Flow\Log\LoggerInterface A logger implementation
*/
protected $logger;
/**
* For logging we need a logger, which we will get injected automatically by
* the Object Manager
*
* @param \TYPO3\Flow\Log\SystemLoggerInterface $logger The System Logger
* @return void
*/
public function injectSystemLogger(\TYPO3\Flow\Log\SystemLoggerInterface ⏎
$systemLogger) {
$this->logger = $systemLogger;
}
/**
* Before advice, logs all access to public methods of our package
*
* @param \TYPO3\Flow\AOP\JoinPointInterface $joinPoint: The current join point
* @return void
* @Flow\Before("method(public Example\MyPackage\.*->.*())")
*/
public function logMethodExecution(\TYPO3\Flow\AOP\JoinPointInterface $joinPoint) {
$logMessage = 'The method ' . $joinPoint->getMethodName() . ' in class ' .
$joinPoint->getClassName() . ' has been called.';
$this->logger->log($logMessage);
}
}
重要な行は次のとおりです。
@Flow\Before("method(public Example\MyPackage\.*->.*())")
名前空間logMethodExecution
の任意のクラスのメソッド呼び出しの前に呼び出すようにフレームワークに指示します。Example\MyPackage
だから、Flow3を使えばそれができます。しかし、AOP フレームワークなしで自分で同様の動作を実装すると、必ず失敗します。