CrossPHP
  • Namespace
  • Class
  • Download

Namespaces

  • Cross
    • Auth
    • Cache
      • Driver
      • Request
    • Core
    • DB
      • Connecter
      • Drivers
      • SQLAssembler
    • Exception
    • Http
    • I
    • Lib
      • Document
    • Module
    • MVC
    • Runtime
  • None

Classes

  • Cross\Auth\CookieAuth
  • Cross\Auth\SessionAuth
  • Cross\Cache\Driver\FileCacheDriver
  • Cross\Cache\Driver\MemcacheDriver
  • Cross\Cache\Driver\RedisDriver
  • Cross\Cache\Request\FileCache
  • Cross\Cache\Request\Memcache
  • Cross\Cache\Request\RedisCache
  • Cross\Cache\RequestCache
  • Cross\Core\Annotate
  • Cross\Core\Application
  • Cross\Core\ArrayMap
  • Cross\Core\Config
  • Cross\Core\CrossArray
  • Cross\Core\Delegate
  • Cross\Core\FrameBase
  • Cross\Core\Helper
  • Cross\Core\HttpAuth
  • Cross\Core\Loader
  • Cross\Core\Rest
  • Cross\Core\Router
  • Cross\DB\Connecter\BaseConnecter
  • Cross\DB\Connecter\MySQLConnecter
  • Cross\DB\Connecter\PgSQLConnecter
  • Cross\DB\Connecter\SQLiteConnecter
  • Cross\DB\DBFactory
  • Cross\DB\Drivers\CouchDriver
  • Cross\DB\Drivers\MongoDriver
  • Cross\DB\Drivers\PDOSqlDriver
  • Cross\DB\SQLAssembler\MySQLAssembler
  • Cross\DB\SQLAssembler\PgSQLAssembler
  • Cross\DB\SQLAssembler\SQLAssembler
  • Cross\DB\SQLAssembler\SQLiteAssembler
  • Cross\Http\Request
  • Cross\Http\Response
  • Cross\Lib\Array2XML
  • Cross\Lib\Document\CallTree
  • Cross\Lib\Document\CallTreeToHTML
  • Cross\Lib\Document\HTML
  • Cross\Lib\StringToPHPStream
  • Cross\Module\SQLModule
  • Cross\MVC\Controller
  • Cross\MVC\Module
  • Cross\MVC\View
  • Cross\Runtime\ClosureContainer

Interfaces

  • Cross\I\CacheInterface
  • Cross\I\HttpAuthInterface
  • Cross\I\PDOConnecter
  • Cross\I\RequestCacheInterface
  • Cross\I\RouterInterface
  • Cross\I\SqlInterface

Exceptions

  • Cross\Exception\CacheException
  • Cross\Exception\CoreException
  • Cross\Exception\CrossException
  • Cross\Exception\FrontException

Functions

  • ascLogo
  • line
  • tBody
  • th
  • tHead
  1 <?php
  2 /**
  3  * Cross - a micro PHP 5 framework
  4  *
  5  * @link        http://www.crossphp.com
  6  * @license     MIT License
  7  */
  8 
  9 namespace Cross\Core;
 10 
 11 use Closure;
 12 
 13 /**
 14  * @author wonli <wonli@live.com>
 15  * Class Annotate
 16  * @package Cross\Core
 17  */
 18 class Annotate
 19 {
 20     /**
 21      * @var Delegate
 22      */
 23     private $delegate;
 24 
 25     /**
 26      * 注释参数前缀
 27      *
 28      * @var string
 29      */
 30     private $prefix = 'cp_';
 31 
 32     /**
 33      * @var Annotate
 34      */
 35     private static $instance;
 36 
 37     /**
 38      * 注册一个wrapper
 39      *
 40      * @param Delegate $delegate
 41      */
 42     private function __construct(Delegate &$delegate)
 43     {
 44         $this->delegate = $delegate;
 45         stream_register_wrapper('annotate', 'Cross\Lib\StringToPHPStream');
 46     }
 47 
 48     /**
 49      * 生成解析注释配置单例对象
 50      *
 51      * @param Delegate $delegate
 52      * @return Annotate
 53      */
 54     public static function getInstance(Delegate &$delegate)
 55     {
 56         if (!self::$instance) {
 57             self::$instance = new Annotate($delegate);
 58         }
 59 
 60         return self::$instance;
 61     }
 62 
 63     /**
 64      * 设置前缀
 65      *
 66      * @param string $prefix
 67      * @return $this
 68      */
 69     function setPrefix($prefix)
 70     {
 71         $this->prefix = $prefix;
 72         return $this;
 73     }
 74 
 75     /**
 76      * 注释配置转换为数组
 77      *
 78      * @param string $annotate
 79      * @return array
 80      */
 81     public function parse($annotate = '')
 82     {
 83         if (empty($annotate)) {
 84             return array();
 85         }
 86 
 87         $flag = preg_match_all("/@{$this->prefix}(.*?)\s+(.*)/", $annotate, $content);
 88         if (!$flag) {
 89             return array();
 90         }
 91 
 92         $configs = array_combine($content[1], $content[2]);
 93         return $this->parseAnnotate($configs);
 94     }
 95 
 96     /**
 97      * 把PHP代码绑定到匿名函数中
 98      *
 99      * @param string $params
100      * @return Closure
101      */
102     public function bindToClosure($params)
103     {
104         return function ($self) use ($params) {
105             return include("annotate://{$params}");
106         };
107     }
108 
109     /**
110      * php字符串代码通过wrapper转换为php代码
111      *
112      * @param string $params
113      * @return mixed
114      */
115     public function toCode($params)
116     {
117         return include("annotate://{$params}");
118     }
119 
120     /**
121      * 配置参数值解析
122      * <pre>
123      * 如: a, b=file, c 会被解析为
124      * array(
125      *      'a' => '',
126      *      'b' => file,
127      *      'c' => '',
128      * )
129      * </pre>
130      *
131      * @param $params
132      * @return array
133      */
134     public function toArray($params)
135     {
136         $result = array();
137         $conf = array_map('trim', explode(',', $params));
138         foreach ($conf as $c) {
139             if (false !== strpos($c, '=')) {
140                 $c = explode('=', $c);
141                 $result[trim($c[0])] = isset($c[1]) ? trim($c[1]) : '';
142             } else {
143                 $result[$c] = '';
144             }
145         }
146         unset($conf);
147 
148         return $result;
149     }
150 
151     /**
152      * 注释配置解析
153      *
154      * @param array $annotateConfigs
155      * @return array
156      */
157     private function parseAnnotate(array $annotateConfigs)
158     {
159         $result = array();
160         foreach ($annotateConfigs as $conf => $params) {
161             switch ($conf) {
162                 case 'params':
163                     $result['params'] = $this->toArray($params);
164                     break;
165 
166                 case 'cache':
167                 case 'response':
168                 case 'basicAuth':
169                     $result[$conf] = $this->toCode($params);
170                     break;
171 
172                 case 'after':
173                 case 'before':
174                     $result[$conf] = $this->bindToClosure($params);
175                     break;
176 
177                 default:
178                     $params = trim($params);
179                     $closureContainer = $this->delegate->getClosureContainer();
180                     $hasClosure = $closureContainer->has('parseAnnotate');
181                     if ($hasClosure) {
182                         $closureContainer->run('parseAnnotate', array($conf, &$params, $this));
183                     }
184 
185                     $result[$conf] = $params;
186             }
187         }
188 
189         return $result;
190     }
191 }
192 
CrossPHP API documentation generated by ApiGen