Troubles with GO! Aspect-Oriented Framework

◇◆丶佛笑我妖孽 提交于 2019-12-24 04:27:09

问题


If someone work with GO! framework, can you help me. I install framework on php 5.3.13. Demo example is working. But my own example doesn't work. Aspect(method beforeMethodExecution) is not perfomed.

Here is my code.

Main file:

//1 Include kernel and all classes
if (file_exists(__DIR__ .'/../../vendor/autoload.php')) {
     $loader = include __DIR__ .'/../../vendor/autoload.php';
}
// 2 Make own ascpect kernel

use Go\Core\AspectKernel;
use Go\Core\AspectContainer;

class Kernel extends AspectKernel{
  /**
   * Configure an AspectContainer with advisors, aspects and pointcuts
   *
   * @param AspectContainer $container
   *
   * @return void
   */
   public function configureAop(AspectContainer $container)
  {
  }
}

//3 Initiate aspect kernel

$Kernel = Kernel::getInstance();

$Kernel->init();

//4 Include aspect
include(__DIR__.'/aspectclass/AspectClass.php');

$aspect = new DebugAspect();

//5 register aspect
$Kernel->getContainer()->registerAspect($aspect);


//6 Include test class

include(__DIR__.'/class/class1.php'); 


//7 Execute test class

$Class = new General('test');
$Class->publicHello();

File with test class:

class General{
protected $message = '';

public function __construct($message)
{
    $this->message = $message;
}

public function publicHello()
{
    echo 'Hello, you have a public message: ', $this->message, "<br>", PHP_EOL;
}

}

File with aspect:

use Go\Aop\Aspect;
use Go\Aop\Intercept\FieldAccess;
use Go\Aop\Intercept\FunctionInvocation;
use Go\Aop\Intercept\MethodInvocation;
use Go\Lang\Annotation\After;
use Go\Lang\Annotation\Before;
use Go\Lang\Annotation\Around;
use Go\Lang\Annotation\Pointcut;
use Go\Lang\Annotation\DeclareParents;
use Go\Lang\Annotation\DeclareError;

class DebugAspect implements Aspect{

/**
 * Method that should be called before real method
 *
 * @param MethodInvocation $invocation Invocation
 * @Before("execution(General->*(*))")
 *
 */
public function beforeMethodExecution(MethodInvocation $invocation)
{
    $obj = $invocation->getThis();
    echo 'Calling Before Interceptor for method: ',
    is_object($obj) ? get_class($obj) : $obj,
    $invocation->getMethod()->isStatic() ? '::' : '->',
    $invocation->getMethod()->getName(),
    '()',
    ' with arguments: ',
    json_encode($invocation->getArguments()),
    PHP_EOL;
}


}

回答1:


As you know, go-aop isn't a PHP extension, so it couldn't transform classes that were loaded directly via require or include. Internally it tries to overwrite the source code on-the-fly, but it should receive a control (via integration with composer or custom autoloader class).

So, you have an error here:

//6 Include test class
include(__DIR__.'/class/class1.php');

You explicitly load this class into memory and there is no way to transform it from userland. To pass a control to the framework, you should make this explicitly. Look at the line AopComposerLoader.php#L99 to have an idea how it works. Here we include a source file via the stream source filter that pass control to the framework and it can transform the class to weave an aspects.

To fix your example just change an include to the following:

include (FilterInjectorTransformer::rewrite(__DIR__.'/class/class1.php')); 


来源:https://stackoverflow.com/questions/24271015/troubles-with-go-aspect-oriented-framework

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!