Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- class Controller {
- /**
- * Тестовое действие
- * @a /^[0-9]+$/i
- * @b /^[0-9a-z]+$/i
- */
- function testAction ( $a, $b = 'something' ) {
- echo 'a: '.$a.', b: '.$b;
- }
- }
- function CheckURLValid ( $class, $method, $values_arr = array() ) {
- $class = new ReflectionClass( $class );
- $method = $class->getMethod( $method );
- $param = $method->getParameters();
- $doc = $method->getDocComment();
- //Разбираем PHPdoc
- preg_match_all( '/@([a-z0-9_-]+)([^\n]+)/is', $doc, $arr );
- $reg_arr = array_combine($arr[1], $arr[2]);
- //Проходим по аргументам функции
- $params_arr = array();
- foreach ( $param as $p ) {
- $key = $p->getName();
- $value = isset ( $values_arr[$key] ) ? $values_arr[$key] : false;
- $regular = isset ( $reg_arr[$key] ) ? trim($reg_arr[$key]) : false;
- $default = $p->isDefaultValueAvailable() ? $p->getDefaultValue() : NULL;
- //Если есть регулярка - проверяем
- if ( isset ( $values_arr[$key] ) ) {
- if ( $regular && !preg_match( $regular, $values_arr[$key] ) )
- throw new Exception( 'Параметр "'.$key.'" указан неверно!' );
- //Если параметр обязательный и он не указан
- } elseif ( !$p->isOptional() )
- throw new Exception( 'Указаны не все обязательные параметры!' );
- //Добавляем значение в общий массив
- $params_arr[$key] = $value ? $value : $default;
- }
- //Проверяем наличие лишних параметров
- if ( count(array_diff_key( $values_arr, $params_arr )) )
- throw new Exception ( 'Указаны лишние параметры!' );
- return $params_arr;
- }
- /*
- Пробуем что же получилось:
- /test.php
- /test.php?a=abc
- /test.php?a=12
- /test.php?a=12&b=another
- /test.php?a=12&c=13
- */
- try {
- $arr = CheckURLValid( 'Controller', 'testAction', $_GET );
- call_user_func_array( array('Controller', 'testAction'), $arr );
- } catch ( Exception $e ) {
- echo $e->getMessage();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement