azverin

PHP Reflection

Mar 9th, 2012
198
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2.  
  3.     class Controller {
  4.         /**
  5.          * Тестовое действие
  6.          * @a /^[0-9]+$/i
  7.          * @b /^[0-9a-z]+$/i
  8.          */
  9.         function testAction ( $a, $b = 'something' ) {
  10.             echo 'a: '.$a.', b: '.$b;
  11.         }
  12.     }
  13.  
  14.     function CheckURLValid ( $class, $method, $values_arr = array() ) {
  15.         $class  = new ReflectionClass( $class );
  16.         $method = $class->getMethod( $method );
  17.         $param  = $method->getParameters();
  18.         $doc    = $method->getDocComment();
  19.  
  20.         //Разбираем PHPdoc
  21.         preg_match_all( '/@([a-z0-9_-]+)([^\n]+)/is', $doc, $arr );
  22.         $reg_arr = array_combine($arr[1], $arr[2]);
  23.  
  24.         //Проходим по аргументам функции
  25.         $params_arr = array();
  26.         foreach ( $param as $p ) {
  27.             $key        = $p->getName();
  28.             $value      = isset ( $values_arr[$key] ) ? $values_arr[$key] : false;
  29.             $regular    = isset ( $reg_arr[$key] ) ? trim($reg_arr[$key]) : false;
  30.             $default    = $p->isDefaultValueAvailable() ? $p->getDefaultValue() : NULL;
  31.  
  32.             //Если есть регулярка - проверяем
  33.             if ( isset ( $values_arr[$key] ) ) {
  34.                 if ( $regular && !preg_match( $regular, $values_arr[$key] ) )
  35.                     throw new Exception( 'Параметр "'.$key.'" указан неверно!' );
  36.  
  37.             //Если параметр обязательный и он не указан
  38.             } elseif ( !$p->isOptional() )
  39.                 throw new Exception( 'Указаны не все обязательные параметры!' );
  40.  
  41.             //Добавляем значение в общий массив
  42.             $params_arr[$key] = $value ? $value : $default;
  43.         }
  44.  
  45.         //Проверяем наличие лишних параметров
  46.         if ( count(array_diff_key( $values_arr, $params_arr )) )
  47.             throw new Exception ( 'Указаны лишние параметры!' );
  48.  
  49.         return $params_arr;
  50.     }
  51.  
  52.     /*
  53.         Пробуем что же получилось:
  54.         /test.php
  55.         /test.php?a=abc
  56.         /test.php?a=12
  57.         /test.php?a=12&b=another
  58.         /test.php?a=12&c=13
  59.     */
  60.  
  61.     try {
  62.         $arr = CheckURLValid( 'Controller', 'testAction', $_GET );
  63.         call_user_func_array( array('Controller', 'testAction'), $arr );
  64.     } catch ( Exception $e ) {
  65.         echo $e->getMessage();
  66.     }
RAW Paste Data