2011-12-22 3 views
0

рецессивного, у меня есть контроллерОбертывания всех методов контроллера рецессивного

/** 

* !RespondsWith Layouts 

* !Prefix user/ 

*/ 

class UserController extends Controller 

{ 
...... 
} 

Я хочу, чтобы обернуть все методы UserController с использованием Iwrapper. Я знаю, как обернуть метод обычного класса с помощью IWrapper. Но в случае контроллера я не могу это сделать, потому что UserController не создается и его методы автоматически вызывается контроллером выемки.

ответ

1

Вы можете использовать аннотации, чтобы добавить оболочку в класс контроллера. Например, у меня есть контроллер «Nas»

/** 
* !RespondsWith Json,CSV 
* !Prefix nas/ 
*/ 
class NasController extends Controller { 

    /** 
     * !Route GET 
     * !VerifyPermission Module: data, Permission: read, UnauthorizedAction: noEntry 
     */ 
     function index() { 
     } 
} 

аннотации VerifyPermission добавит обертку в методе расширения

Library::import('recess.lang.Annotation'); 
Library::import('cirrusWorks.wrappers.VerifyPermissionWrapper'); 

class VerifyPermissionAnnotation extends Annotation { 

    protected function expand($class, $reflection, $descriptor) { 
     $module = $this->module; 
     $permission = $this->permission; 
     $unauthorizedAction = $this->unauthorizedaction; 

     $descriptor->addWrapper('serve',new VerifyPermissionWrapper($module,$permission,$unauthorizedAction, $reflection->getName())); 
     /* ... */ 
     return $descriptor; 
    } 
} 

Затем вы можете создать VerifyPermissionWrapper и стандартные методы будет обернут вокруг вашего класса (до(), после(), объединения())

class VerifyPermissionWrapper implements IWrapper { 
    function __construct($module, $permission, $action, $method) { 
     $this->module = $module; 
     $this->permission = $permission; 
     $this->action = $action; 
     $this->method = $method; 
    } 

    function before($controller, &$args) { 
     error_log('Before {$this->action} on {$this->method}'); 
    } 
} 
Смежные вопросы