123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- <?php
- namespace app\doc;
- class Doc
- {
- protected $ext = ".php";
- private $FolderDescFile = "AFolderDesc.php";
- protected $config = [];
-
- public function __construct($config = [])
- {
- $this->config = array_merge($this->config, $config);
- }
-
- public function __get($name = null)
- {
- if ($name) {
- return $this->config[$name];
- } else {
- return $this->config;
- }
- }
-
- public function __set($name, $value)
- {
- if (isset($this->config[$name])) {
- $this->config[$name] = $value;
- }
- }
-
- public function __isset($name)
- {
- return isset($this->config[$name]);
- }
- public function getList($file,$type)
- {
- if($type=='folder'){
- return $this->getFileList($file);
- }elseif($type=='file'){
- return $this->getActionList($file);
- }
- }
-
-
- public function getActionList($file)
- {
- $class = str_replace(root_path(),'',$file);
- $class = str_replace('/','\\',$class);
- return $this->getMethod($class);
- }
-
-
- public function getFileList($path)
- {
- $list = [];
- $files = $this->getChildFile($path);
- foreach($files as $value){
- $file = $path.DS.$value;
- if(is_file($file)){
- $classpath = $path.DS.basename($value,$this->ext);
- $item = $this->parseCls($classpath);
- $item['type'] = 'file';
-
- $children = $this->getMethod($item['class']);
- if(count($children)>0){
- $item['hasChild'] = true;
- $list[] = $item;
- }
- }elseif(is_dir($file)){
- $classFile = $file.DS.$this->FolderDescFile;
- if(!is_file($classFile)){
- $this->createDescFile($classFile,$value);
- }
- $classpath = $path.DS.$value.DS.basename($this->FolderDescFile,$this->ext);
- $item = $this->parseCls($classpath);
- $item['type'] = 'folder';
- $item['path'] = $file;
-
- $children = $this->getChildFile($file);
- if(count($children)>0){
- $item['hasChild'] = true;
- $list[] = $item;
- }
- }
- }
- return $list;
- }
-
-
- private function createDescFile($file,$name)
- {
- $dir = dirname($file);
- chmod($dir,0777);
- $classname = basename($this->FolderDescFile,$this->ext);
- $namespace = str_replace(root_path(),"",$dir);
- $namespace = str_replace('/','\\',$namespace);
- $content = "<?php\r\nnamespace $namespace;\r\n /**\r\n * @title: $name\r\n */ \r\nclass $classname\r\n{\r\n\r\n}";
- $f = fopen($file,"w");
- file_put_contents($file,$content);
- }
-
-
- private function parseCls($classpath)
- {
- $name = basename($classpath);
- $class = str_replace(root_path(),'',$classpath);
- $class = str_replace('/','\\',$class);
- $info = [];
- if (class_exists($class)) {
- $reflection = new \ReflectionClass($class);
- $doc_str = $reflection->getDocComment();
- $doc = new Parser();
- $class_doc = $doc->parse_class($doc_str);
- $info['class'] = $class;
- $info['name'] = $name;
- $info['path'] = $classpath;
- $info['title'] = isset($class_doc['title'])?$class_doc['title']:$name;
- $info['icon'] = isset($class_doc['icon'])?$class_doc['icon']:'';
- $info['desc'] = isset($class_doc['desc'])?$class_doc['desc']:'';
- $info['author'] = isset($class_doc['Author'])?$class_doc['Author']:'无名';
- $info['LastEditTime'] = isset($class_doc['LastEditTime'])?$class_doc['LastEditTime']:'';
- }else{
- $info['class'] = $class;
- $info['name'] = $name;
- $info['path'] = $classpath;
- $info['title'] = $name;
- $info['icon'] = '';
- $info['desc'] = '';
- $info['author'] = '无名';
- $info['LastEditTime'] = '';
- }
- $info['is_leaf'] = false;
- return $info;
- }
-
-
- private function getMethod($class)
- {
- $list = [];
- if(class_exists($class)){
- $doc = new Parser();
- $reflection = new \ReflectionClass($class);
-
- $methods = $reflection->getMethods(\ReflectionMethod::IS_PUBLIC);
-
- $filter_method = array_merge(['__construct','initialize','_initialize','__destruct'], $this->config['filter_method']);
- foreach ($methods as $key => $action) {
- if (!in_array($action->name, $filter_method) && $action->class === $class) {
- if ($doc->parse_action($action)){
- $temp = $doc->parse_action($action);
- if(!empty($temp['title'])){
- $info = $doc->parse_action($action);
- $item = [
- 'name' => $action->name,
- 'class' => $class,
- 'path' => root_path().$class.'\\'.$action->name,
- 'title' => $info['title'],
- 'icon' => isset($info['icon'])?$info['icon']:'',
- 'desc' => isset($info['desc'])?$info['desc']:'',
- 'author' => isset($class_doc['Author'])?$class_doc['Author']:'无名',
- 'LastEditTime' => isset($info['LastEditTime'])?$info['LastEditTime']:'',
- 'type' => 'action',
- 'is_leaf' => true,
- ];
- $list[] = $item;
- }
- }
- }
- }
- }
- return $list;
- }
-
-
- private function getChildFile($path)
- {
- $list = [];
- $files = scandir($path);
- foreach($files as $value){
- if($value!='.' && $value!='..'){
- $list[] = $value;
- }
- }
- return $list;
- }
-
- public function get_api_detail($class='',$action='')
- {
- $method = (new \ReflectionClass($class))->getMethod($action);
- return (new Parser())->parse_action($method);
- }
- }
|