added format and endpoint into constructor,

fixed processing of parameters in methods,
added return for HTML manual,
chaged TypeScript code to class object export as default
This commit is contained in:
Igor Miňo 2025-06-01 19:19:48 +02:00
parent 2f7f63b620
commit a59044102c
3 changed files with 63 additions and 17 deletions

View File

@ -18,23 +18,40 @@ class APIlite
{ {
private string $apiName = ''; private string $apiName = '';
private string $endpoint = '';
private $methods = array(); private $methods = array();
public function __construct() public function __construct(?string $format = null, ?string $endpoint = null)
{ {
register_shutdown_function(array($this, '_shutdownHandler')); register_shutdown_function(array($this, '_shutdownHandler'));
$this->endpoint = $endpoint ?? $this->getCurrentUrl();
$this->analyzeClass(); $this->analyzeClass();
if (isset($_REQUEST['action'])) { if (isset($_REQUEST['action'])) {
$this->doAction($_REQUEST['action']); $this->doAction($_REQUEST['action']);
} else { } else {
global $argv; global $argv;
$switches = array_map('strtolower', is_array($argv) ? $argv : []); if (isset($_REQUEST['format'])) {
if ((isset($_REQUEST['format']) && $_REQUEST['format'] == 'html') || in_array('--html', $switches)) { $format = $_REQUEST['format'];
$this->printHelpHTML(); }
} elseif ((isset($_REQUEST['format']) && $_REQUEST['format'] == 'typescript') || in_array('--typescript', $switches)) { if (isset($argv)) {
$this->printHelpTypescript(); $switches = array_map('strtolower', is_array($argv) ? $argv : []);
} else { if (in_array('--html', $switches)) {
$this->printHelpJSON(); $format = 'html';
}
if (in_array('--typescript', $switches)) {
$format = 'typescript';
}
}
switch ($format) {
case 'html':
$this->printHelpHTML();
break;
case 'typescript':
$this->printHelpTypescript();
break;
default:
$this->printHelpJSON();
break;
} }
} }
} }
@ -50,7 +67,7 @@ class APIlite
private function analyzeClass(): bool private function analyzeClass(): bool
{ {
$refClass = new \ReflectionClass($this); $refClass = new \ReflectionClass($this);
$this->apiName = $refClass->getName(); $this->apiName = $refClass->getShortName();
$this->methods = array(); $this->methods = array();
foreach ($refClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $ref_method) { foreach ($refClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $ref_method) {
$method_name = $ref_method->getName(); $method_name = $ref_method->getName();
@ -81,11 +98,28 @@ class APIlite
if ($ref_param->isOptional()) { if ($ref_param->isOptional()) {
$param['default'] = $ref_param->getDefaultValue(); $param['default'] = $ref_param->getDefaultValue();
} }
$param['doc'] = $this->parseParamDoc($method['doc'], $param['name']); if (!is_null($method['doc'])) {
$param['doc'] = $this->parseParamDoc($method['doc'], $param['name']);
}
$method['params'][] = $param; $method['params'][] = $param;
} }
if ($ref_method->hasReturnType()) { if ($ref_method->hasReturnType()) {
$method['return'] = $ref_method->getReturnType()->getName(); $ref_type = $ref_method->getReturnType();
if ($ref_type instanceof \ReflectionNamedType) {
$method['return'] = $ref_type->getName();
}
if ($ref_type instanceof \ReflectionUnionType
|| $ref_type instanceof \ReflectionIntersectionType )
{
$types = $ref_type->getTypes();
$method['return'] = [];
foreach ($types as $type) {
if ($type instanceof \ReflectionNamedType) {
$method['return'][] = $type->getName();
}
}
}
} }
$this->methods[] = $method; $this->methods[] = $method;
} }

View File

@ -306,6 +306,16 @@
</div> </div>
</div> </div>
<?php } ?> <?php } ?>
<h3 style="margin-bottom: 1rem; color: #2c3e50; display: inline-block;">Return:</h3>
<?php if (is_string($method['return'])) { ?>
<code class="parameter-type"><?php echo $method['return']; ?></code>
<?php } ?>
<?php if (is_array($method['return'])) foreach ($method['return'] as $return) { ?>
<code class="parameter-type"><?php echo $return; ?></code>
<?php } ?>
</div> </div>
<?php } ?> <?php } ?>
</section> </section>

View File

@ -5,8 +5,8 @@
* <?php echo date('Y-m-d H:i:s'); ?> * <?php echo date('Y-m-d H:i:s'); ?>
*/ */
export const backend = { class <?php echo $this->apiName; ?> {
endpont: window.location.origin + "<?php echo $this->apiName; ?>.php", endpont = "<?php echo $this->endpoint; ?>";
/* ---------------------------------------------------- /* ----------------------------------------------------
* General API call * General API call
@ -31,7 +31,7 @@ export const backend = {
}); });
xhttp.open('POST', this.endpont + '?action=' + method); xhttp.open('POST', this.endpont + '?action=' + method);
xhttp.send(form_data); xhttp.send(form_data);
}, }
callPromise(method, data) { callPromise(method, data) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -43,20 +43,22 @@ export const backend = {
} }
}); });
}) })
}, }
/* ---------------------------------------------------- /* ----------------------------------------------------
* API actions * API actions
*/ */
help() { help() {
return this.callPromise('__HELP__', {}); return this.callPromise('__HELP__', {});
}, }
<?php if (is_array($this->methods)) foreach ($this->methods as $method) { <?php if (is_array($this->methods)) foreach ($this->methods as $method) {
echo "\t".$method['name'].'('.implode(', ', array_map(function($param) { return $param['name']; }, $method['params'])).') {'; echo "\t".$method['name'].'('.implode(', ', array_map(function($param) { return $param['name']; }, $method['params'])).') {';
echo "\n\t\treturn this.callPromise('".$method['name']."', {".implode(', ', array_map(function($param) { return $param['name'].': '.$param['name']; }, $method['params']))."});"; echo "\n\t\treturn this.callPromise('".$method['name']."', {".implode(', ', array_map(function($param) { return $param['name'].': '.$param['name']; }, $method['params']))."});";
echo "\n\t},\n\n"; echo "\n\t}\n\n";
} }
?> ?>
}; };
export default new BackendAPI();