PHP code example of kode / aop
1. Go to this page and download the library: Download kode/aop library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
kode / aop example snippets
use Kode\Aop\Attribute\Aspect;
use Kode\Aop\Attribute\Before;
use Kode\Aop\Attribute\After;
use Kode\Aop\Attribute\Around;
use Kode\Aop\Runtime\JoinPoint;
use Kode\Aop\Runtime\ProceedingJoinPoint;
#[Aspect]
class LoggingAspect
{
#[Before("execution(* App\Service\UserService->createUser(..))")]
public function logBefore(JoinPoint $joinPoint): void
{
$args = $joinPoint->getArguments();
echo "准备创建用户: " . json_encode($args[0]) . "\n";
}
#[After("execution(* App\Service\UserService->createUser(..))")]
public function logAfter(JoinPoint $joinPoint): void
{
echo "用户创建操作已完成\n";
}
}
use Kode\Aop\Runtime\AspectKernel;
$kernel = AspectKernel::getInstance();
$kernel->registerAspect(new LoggingAspect());
$kernel->init();
$userService = $kernel->getProxy(UserService::class);
$result = $userService->createUser([
'name' => 'John Doe',
'email' => '[email protected] '
]);
#[Before("execution(* App\Service\*->*(..))")]
public function logBefore(JoinPoint $joinPoint): void
{
$methodName = $joinPoint->getMethodName();
$args = $joinPoint->getArguments();
echo "方法 {$methodName} 即将执行\n";
// 修改参数
if (isset($args[0])) {
$args[0] = trim($args[0]);
$joinPoint->setArguments($args);
}
}
#[After("execution(* App\Service\*->*(..))")]
public function logAfter(JoinPoint $joinPoint): void
{
$result = $joinPoint->getResult();
echo "方法执行完成,返回值: " . json_encode($result) . "\n";
}
#[Around("execution(* App\Service\UserService->*(..))")]
public function transactional(ProceedingJoinPoint $joinPoint): mixed
{
echo "开始事务\n";
try {
$result = $joinPoint->proceed();
echo "提交事务\n";
return $result;
} catch (\Exception $e) {
echo "回滚事务\n";
throw $e;
}
}
#[Aspect]
class PriorityAspect
{
#[Before("execution(* App\Service\*->*(..))")]
#[Priority(Priority::HIGHEST)] // 最先执行
public function first(JoinPoint $joinPoint): void
{
echo "第一个执行\n";
}
#[Before("execution(* App\Service\*->*(..))")]
#[Priority(100)]
public function second(JoinPoint $joinPoint): void
{
echo "第二个执行\n";
}
}
$joinPoint->getClass(); // 获取目标类的反射对象
$joinPoint->getMethod(); // 获取目标方法的反射对象
$joinPoint->getThis(); // 获取目标对象实例
$joinPoint->getArguments(); // 获取方法参数
$joinPoint->setArguments([]); // 设置方法参数
$joinPoint->getPointcut(); // 获取切入点表达式
$joinPoint->getResult(); // 获取返回值(After 通知)
$joinPoint->getMethodName(); // 获取方法名
$joinPoint->getClassName(); // 获取类名
$joinPoint->getArgument(0); // 获取指定位置的参数
$result = $joinPoint->proceed(); // 使用原始参数执行
$result = $joinPoint->proceed(['newArg']); // 使用新参数执行
$result = $joinPoint->proceedWithNamedParams([...]); // 使用命名参数执行
$closure = $joinPoint->getProceedClosure(); // 获取执行闭包
// app/Providers/AopServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Kode\Aop\Runtime\AspectKernel;
class AopServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->singleton(AspectKernel::class, function () {
$kernel = AspectKernel::getInstance();
$kernel->registerAspect(new \App\Aspects\LoggingAspect());
$kernel->registerAspect(new \App\Aspects\TransactionAspect());
$kernel->init();
return $kernel;
});
}
}
// config/services.yaml
services:
Kode\Aop\Runtime\AspectKernel:
factory: ['@App\Aop\AspectKernelFactory', 'create']
calls:
- [init, []]
App\Aop\AspectKernelFactory:
class: App\Aop\AspectKernelFactory
// config/autoload/dependencies.php
return [
Kode\Aop\Runtime\AspectKernel::class => function () {
$kernel = Kode\Aop\Runtime\AspectKernel::getInstance();
$kernel->registerAspect(new \App\Aspect\LoggingAspect());
$kernel->init();
return $kernel;
},
];
bash
composer analyse