FeipAPI/Mirzaev/Feip/Methods/MethodAbstract.php

183 lines
5.9 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
namespace Mirzaev\Feip\Methods;
use Mirzaev\Feip\Error;
/**
* MethodAbstract
*
* @param array $ignore Список игнорируемых свойств
*
* @method public function __construct(array $params) Сборщик
* @method public filter(string $var, $params) Фильтрация входящих параметров
* @method public function json() Возвращает json-строку собранную из объекта
* @method private static function camelCase(string $text) Конвертация в camelCase (lower)
*
* @package Mirzaev\Feip\Methods
* @author Арсен Мирзаев <red@hood.su>
*/
class MethodAbstract
{
/**
* Список игнорируемых свойств
*
* @var array
*/
protected array $ignore = [];
/**
* Сборщик
*
* Получает параметры и присваивает к одноимённым свойствам
*
* @param array $params Параметры
*/
public function __construct(array $params)
{
// Обработка входящих параметров
foreach ($this as $var => $value) {
// Перебор свойств объекта
// Вызов метода Before
$method = $this::camelCase($var . 'Before');
if (method_exists($this, $method)) {
// Если есть метод before, то вызвать его
$this::$method();
}
// Список игнорируемых параметров
if (in_array($var, $this->ignore) || $var === 'ignore') {
// Если найден в списке, то пропустить
continue;
}
// Нет значения
if (empty($params[$var])) {
// Если переданный параметр имеет пустое значение
new Error(100, $var);
continue;
}
// Массив
if (is_array($params[$var])) {
// Массив
if (is_array($value)) {
// Если тип идентичного параметру свойства является массивом
$this->$var = $this->filter($var, $params[$var]);
} else {
new Error(200, $var);
}
} else if (null !== $filtered = $this->filter($var, $params[$var])) {
// Иначе, если получено скалярное значение и результат его фильтрации
$this->$var = $filtered;
}
// Вызов метода After
$method = $this::camelCase($var . 'After');
if (method_exists($this, $method)) {
// Если есть метод after, то вызвать его
$this::$method();
}
}
}
/**
* Фильтр
*
* @param string|int $var Свойство объекта
* @param mixed $params Параметры
*
* @return mixed
*/
public function filter($var, $params)
{
// Инициализация
$response = [];
if (!is_array($params)) {
// Если передан скалярный параметр
$params = [$var => $params];
}
// Обработка
foreach ($params as $key => $value) {
// Перебор входных параметров
// Массив
if (is_array($value)) {
// Если передан массив, то войти в цикл для обработки
$response[$key] = $this->filter($key, $value);
}
// Инициализация метода
$method = $this::camelCase($key);
// Скалярное значение
if (method_exists($this, $method)) {
// Если существует фильтр для параметра
if ($value_filtered = $this::$method($value)) {
// Если фильтрация вернула результат
$response[$key] = $value_filtered;
}
}
}
// Деинициализация
if (count($params) === 1) {
// Если в начале был передан скалярный параметр
$response = array_pop($response);
}
return $response;
}
/**
* Конвертация в json
*
* Возвращает строку json со значеним из всех свойств объекта
*
* @return string
*/
public function json(): string
{
// Инициализация
$response = [
'response' => [],
'errors' => Error::get()
];
// Генерация ответа
foreach ($this as $var => $value) {
// Перебор свойств объекта
if (in_array($var, $this->ignore) || $var === 'ignore') {
// Если добавлен в чёрный список, то пропустить
continue;
}
$response['response'][$var] = $value;
}
var_dump($this->ignore);
return json_encode($response);
}
/**
* Конвертация в camelCase (lower)
*
* Возвращает строку в формате camelCase (lower)
*
* @param string|int $text Строка для конвертации
*
* @return string
*/
private static function camelCase($text): string
{
return (string) preg_replace_callback('/_(.?)/', fn ($m) => strtoupper($m[1]), $text);
}
}