yzh52521 / webman-aop
适用于 webman 插件的自定义切片
v1.0.5
2023-10-18 08:32 UTC
Requires
- php: >=7.2
- nikic/php-parser: ^4.10.4
README
composer require yzh52521/webman-aop
AOP 相关配置:config/plugin/yzh52521/aop/app.php 配置
<?php
return [
'aspect' => [
\app\aspect\UserAspect::class,
],
];
首先让我们编写待切入类
<?php
namespace app\service;
class UserService
{
public function info()
{
echo 'UserService info' . PHP_EOL;
}
}
其次新增对应的 UserAspect
namespace app\aspect;
use app\service\UserService;
use yzh52521\aop\Aop\AbstractAspect;
use yzh52521\aop\Aop\interfaces\ProceedingJoinPointInterface;
/**
* Class UserAspect
* @package app\aspect
*/
class UserAspect extends AbstractAspect
{
public $classes = [
UserService::class . '::info',
];
/**
* @param ProceedingJoinPointInterface $entryClass
* @return mixed
*/
public function process(ProceedingJoinPointInterface $entryClass)
{
var_dump('UserAspect before');
$res = $entryClass->process();
var_dump('UserAspect after');
return $res;
}
}
测试,在 app\controller\Index 修改代码示例:
public function index()
{
/** @var UserService $userService */
$userService = load(UserService::class);
$userService->info();
}
使用命令行运行 php start.php start,输出结果如下:
UserAspect before
UserService info
UserAspect after
切入顺序:如果有多个切面类对同一个类方法进行切入,会按照配置文件中定义的顺序执行
容器 load 函数在 helpers.php 中定义如下示例:
/**
* 加载容器的对象
*/
if (! function_exists('load')) {
function load(string $class)
{
return \support\Container::get($class);
}
}