aop使用教程
composer require yzh52521/webman-aop
在根目录增加define.php
use yzh52521\aop\ClassLoader;
$appConfig = config('app');
if (isset($appConfig['default_timezone'])) {
date_default_timezone_set($appConfig['default_timezone']);
}
//aop
ClassLoader::reload(config('aop'));
ClassLoader::init();
在start.php文件下引入 define.php
require_once __DIR__ . '/define.php';
增加 AOP 切片 相关配置 我们需要在 config 目录下,增加 aop.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\AbstractAspect;
use yzh52521\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::instance()->get($class);
}
}
不增加也行
在start.php 加上这两句
ClassLoader::reload(config('aop'));
ClassLoader::init();
我是有强迫症:不该框架的任何代码。包括
start.php
,哈哈非常感谢你的分享。
webman下个版本尝试规范下组件,做到组件配置与项目配置隔离。并且自动化安装卸载。这样就不会入侵项目的代码了。现在在测试,预计还有几天发布。到时候可以按照规范弄下,就完美了。
期待
已升级为插件形式
我想问一下 ,windows下能用吗?
可以
为什么github上的说明和这个不一样呢?以哪个为准
Fatal error: Uncaught Error: Call to undefined function yzh52521\aop\Aop\value() in saas\test\vendor\yzh52521\webman-aop\src\Aop\ProxyNodeVisitor.php:141
一直报错,怎么处理啊,是没有把文件上传完整吗?