Welcome

This demo shows your an examples of AOP usage.

Please, choose one of available examples from navigation menu.
You can also try to run this code with XDebug.

Calling Magic Interceptor for method: Demo\Example\DynamicMethodsDemo->saveById() with arguments: [123]
I'm method: saveById
I'm method: load
Calling Magic Static Interceptor for method: find
I'm static method: find
  
<?php
/*
 * Go! AOP framework
 *
 * @copyright Copyright 2014, Lisachenko Alexander <lisachenko.it@gmail.com>
 *
 * This source file is subject to the license that is bundled
 * with this source code in the file LICENSE.
 */

namespace Demo\Aspect;

use 
Go\Aop\Aspect;
use 
Go\Aop\Intercept\MethodInvocation;
use 
Go\Lang\Annotation\Before;

/**
 * Aspect that intercepts specific magic methods, declared with __call and __callStatic
 */
class DynamicMethodsAspect implements Aspect
{

    
/**
     * This advice intercepts an execution of __call methods
     *
     * Unlike traditional "execution" pointcut, "dynamic" is checking the name of method in
     * the runtime, allowing to write interceptors for __call more transparently.
     *
     * @param MethodInvocation $invocation Invocation
     *
     * @Before("dynamic(public Demo\Example\DynamicMethodsDemo->save*(*))")
     */
    
public function beforeMagicMethodExecution(MethodInvocation $invocation)
    {
        
$obj $invocation->getThis();

        
// we need to unpack args from invocation args
        
list($methodName$args) = $invocation->getArguments();
        echo 
'Calling Magic Interceptor for method: ',
            
is_object($obj) ? get_class($obj) : $obj,
            
$invocation->getMethod()->isStatic() ? '::' '->',
            
$methodName,
            
'()',
            
' with arguments: ',
            
json_encode($args),
            
PHP_EOL;
    }

    
/**
     * This advice intercepts an execution of methods via __callStatic
     *
     * @param MethodInvocation $invocation
     * @Before("dynamic(public Demo\Example\DynamicMethodsDemo::find*(*))")
     */
    
public function beforeMagicStaticMethodExecution(MethodInvocation $invocation)
    {
        
// we need to unpack args from invocation args
        
list($methodName) = $invocation->getArguments();

        echo 
"Calling Magic Static Interceptor for method: "$methodNamePHP_EOL;
    }
}
<?php
/*
 * Go! AOP framework
 *
 * @copyright Copyright 2014, Lisachenko Alexander <lisachenko.it@gmail.com>
 *
 * This source file is subject to the license that is bundled
 * with this source code in the file LICENSE.
 */

namespace Demo\Example;

/**
 * Example class to show how to intercept magic methods
 *
 * @method void saveById(int $id)
 * @method void saveByName(string $name)
 * @method void load(int $id)
 * @method static void find(array $args)
 */
class DynamicMethodsDemo
{
    
/**
     * Magic invoker
     *
     * @param string $name Method name
     * @param array $args Method arguments
     */
    
public function __call($name, array $args)
    {
        echo 
"I'm method: {$name}"PHP_EOL;
    }

    
/**
     * Magic static invoker
     *
     * @param string $name Method name
     * @param array $args Method arguments
     */
    
public static function __callStatic($name, array $args)
    {
        echo 
"I'm static method: {$name}"PHP_EOL;
    }
}