在laravel下使用php-parser实现aop
composer require nikic/php-parser
Test.php
<?php
/**
* Created by PhpStorm.
* User: CSH
* Date: 2019/4/4
* Time: 11:26
*/
namespace app;
/**
* 为该类创建代理,并植入切面 埋点
* 使用parser生成对应的语法树,然后主动修改方法体内的逻辑
*
* Class Test
* @package app
*/
class Test
{
// do something before
// do something
// do something after
public function show()
{
return 'Hello World';
}
public function say()
{
return 'I Can Fly';
}
}
ProxyVisitor.php
<?php
/**
* Created by PhpStorm.
* User: CSH
* Date: 2019/4/4
* Time: 11:16
*/
namespace App\Aop;
use PhpParser\Node;
use PhpParser\Node\Expr\Closure;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Name;
use PhpParser\Node\Param;
use PhpParser\Node\Scalar\String_;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Return_;
use PhpParser\Node\Stmt\TraitUse;
use PhpParser\NodeFinder;
use PhpParser\NodeVisitorAbstract;
/**
* PHP Parser在Aop编程中的使用
*
* 流程:
* 1、当我们拿到节点是类时,我们重置这个类,让新建的类继承这个类。
* 2、当我们拿到的节点是类方法时,我们使用proxyCall来重写方法。
* 3、当遍历完成之后,给类加上我们定义好的AopTrait。
*
* NodeVisitor接口调用顺序:beforeTraverse -> enterNode -> leaveNode -> afterTraverse
*
* Class ProxyVisitor
* @package App\Aop
*/
class ProxyVisitor extends NodeVisitorAbstract
{
protected $className;
protected $proxyId;
public function __