如果有人用GO!框架,你能帮我吗?我在php 5.3.13上安装框架。演示示例正在工作。但我自己的例子行不通。Aspect(method beforemethodexexecution)未执行
这是我的代码。
主要文件://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();
测试类文件:
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;
}
}
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;
}
}
你知道,go-aop不是PHP扩展,所以它不能转换直接通过require
或include
加载的类。在内部,它尝试动态地覆盖源代码,但它应该接收一个控件(通过与composer或自定义自动加载器类的集成)。
这里有一个错误:
//6 Include test class
include(__DIR__.'/class/class1.php');
你显式地将这个类加载到内存中,并且没有办法从userland转换它。要将控件传递给框架,您应该显式地这样做。查看AopComposerLoader.php#L99行,了解它是如何工作的。这里我们通过流源过滤器包含一个源文件,它将控制权传递给框架,它可以转换类来编织方面。
要修复您的示例,只需将include
更改为以下内容:
include (FilterInjectorTransformer::rewrite(__DIR__.'/class/class1.php'));