2

誰かがGOで働いているなら!フレームワーク、私を助けてくれませんか。フレームワークをphp 5.3.13にインストールします。デモの例は機能しています。しかし、私の例はうまくいきません。Aspect(method beforeMethodExecution)は実行されません。

これが私のコードです。

メインファイル:

//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;
}

}

アスペクトを持つファイル:

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;
}


}
4

1 に答える 1

3

ご存じのとおり、go-aop は PHP 拡張機能ではないため、requireまたはを介し​​て直接ロードされたクラスを変換できませんでしincludeた。内部的にはオンザフライでソース コードを上書きしようとしますが、コントロールを受け取る必要があります (composer またはカスタム オートローダー クラスとの統合を介して)。

したがって、ここにエラーがあります:

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

このクラスを明示的にメモリにロードすると、ユーザーランドから変換する方法がありません。コントロールをフレームワークに渡すには、これを明示的に行う必要があります。AopComposerLoader.php#L99の行を見て、それがどのように機能するかを理解してください。ここでは、制御をフレームワークに渡すストリーム ソース フィルターを介してソース ファイルを含めます。これにより、クラスを変換してアスペクトを織り込むことができます。

例を修正するincludeには、を次のように変更します。

include (FilterInjectorTransformer::rewrite(__DIR__.'/class/class1.php')); 
于 2014-06-27T06:08:49.733 に答える