GoAOP 框架,无法让简单的 Aspect 工作
GoAOP framework, can't get simple Aspect to work
我曾多次尝试使用 GoAOP library for awhile and have never successfully been able to get it to work. I have gone through the documentation 并复制示例,但甚至无法让它们工作。我现在想要实现的只是一个简单的方面。
我有几个文件如下:
app/ApplicationAspectKernel.php
<?php
require './aspect/MonitorAspect.php';
use Go\Core\AspectKernel;
use Go\Core\AspectContainer;
/**
* Application Aspect Kernel
*/
class ApplicationAspectKernel extends AspectKernel
{
/**
* Configure an AspectContainer with advisors, aspects and pointcuts
*
* @param AspectContainer $container
*
* @return void
*/
protected function configureAop(AspectContainer $container)
{
$container->registerAspect(new Aspect\MonitorAspect());
}
}
init.php
<?php
require './vendor/autoload.php';
require_once './ApplicationAspectKernel.php';
// Initialize an application aspect container
$applicationAspectKernel = ApplicationAspectKernel::getInstance();
$applicationAspectKernel->init(array(
'debug' => true, // Use 'false' for production mode
// Cache directory
'cacheDir' => __DIR__ . '/cache/', // Adjust this path if needed
// Include paths restricts the directories where aspects should be applied, or empty for all source files
'includePaths' => array(__DIR__ . '/app/')
));
require_once './app/Example.php';
$e = new Example();
$e->test1();
$e->test2('parameter');
aspect/MonitorAspect.php
<?php
namespace Aspect;
use Go\Aop\Aspect;
use Go\Aop\Intercept\FieldAccess;
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;
/**
* Monitor aspect
*/
class MonitorAspect implements Aspect
{
/**
* Method that will be called before real method
*
* @param MethodInvocation $invocation Invocation
* @Before("execution(public Example->*(*))")
*/
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()),
"<br>\n";
}
}
app/Example.php
<?php
class Example {
public function test1() {
print 'test1' . PHP_EOL;
}
public function test2($param) {
print $param . PHP_EOL;
}
}
当我 运行 php init.php
它确实 运行 但只是打印而没有 MonitorAspect 的输出。我不知道我是否在 @Before
中定义了错误的切入点(我尝试了几种变体),或者我是否只是对这段代码的工作方式有根本的误解。
如果能帮我指明正确的方向,我们将不胜感激。
GoAOP 框架被设计为与自动加载器一起工作,这意味着它只能处理 class 通过 composer 自动加载器间接加载的 es。
当您通过 require_once './app/Example.php';
手动包含您 class 时 class 会立即由 PHP 加载并且无法通过 AOP 进行转换,所以什么也不会发生,因为 class 已经存在于 PHP 的内存中。
为了使 AOP 工作,您应该将 class 加载委托给 Composer
并为您的 classes 使用 PSR-0/PSR-4 标准。在这种情况下,AOP 将挂钩自动加载过程,并在需要时进行转换。
请参阅我关于 的回答,了解有关框架内部结构的更多详细信息。这些信息应该对你有用。
我曾多次尝试使用 GoAOP library for awhile and have never successfully been able to get it to work. I have gone through the documentation 并复制示例,但甚至无法让它们工作。我现在想要实现的只是一个简单的方面。
我有几个文件如下:
app/ApplicationAspectKernel.php
<?php
require './aspect/MonitorAspect.php';
use Go\Core\AspectKernel;
use Go\Core\AspectContainer;
/**
* Application Aspect Kernel
*/
class ApplicationAspectKernel extends AspectKernel
{
/**
* Configure an AspectContainer with advisors, aspects and pointcuts
*
* @param AspectContainer $container
*
* @return void
*/
protected function configureAop(AspectContainer $container)
{
$container->registerAspect(new Aspect\MonitorAspect());
}
}
init.php
<?php
require './vendor/autoload.php';
require_once './ApplicationAspectKernel.php';
// Initialize an application aspect container
$applicationAspectKernel = ApplicationAspectKernel::getInstance();
$applicationAspectKernel->init(array(
'debug' => true, // Use 'false' for production mode
// Cache directory
'cacheDir' => __DIR__ . '/cache/', // Adjust this path if needed
// Include paths restricts the directories where aspects should be applied, or empty for all source files
'includePaths' => array(__DIR__ . '/app/')
));
require_once './app/Example.php';
$e = new Example();
$e->test1();
$e->test2('parameter');
aspect/MonitorAspect.php
<?php
namespace Aspect;
use Go\Aop\Aspect;
use Go\Aop\Intercept\FieldAccess;
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;
/**
* Monitor aspect
*/
class MonitorAspect implements Aspect
{
/**
* Method that will be called before real method
*
* @param MethodInvocation $invocation Invocation
* @Before("execution(public Example->*(*))")
*/
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()),
"<br>\n";
}
}
app/Example.php
<?php
class Example {
public function test1() {
print 'test1' . PHP_EOL;
}
public function test2($param) {
print $param . PHP_EOL;
}
}
当我 运行 php init.php
它确实 运行 但只是打印而没有 MonitorAspect 的输出。我不知道我是否在 @Before
中定义了错误的切入点(我尝试了几种变体),或者我是否只是对这段代码的工作方式有根本的误解。
如果能帮我指明正确的方向,我们将不胜感激。
GoAOP 框架被设计为与自动加载器一起工作,这意味着它只能处理 class 通过 composer 自动加载器间接加载的 es。
当您通过 require_once './app/Example.php';
手动包含您 class 时 class 会立即由 PHP 加载并且无法通过 AOP 进行转换,所以什么也不会发生,因为 class 已经存在于 PHP 的内存中。
为了使 AOP 工作,您应该将 class 加载委托给 Composer
并为您的 classes 使用 PSR-0/PSR-4 标准。在这种情况下,AOP 将挂钩自动加载过程,并在需要时进行转换。
请参阅我关于