183 lines
5.9 KiB
PHP
183 lines
5.9 KiB
PHP
<?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);
|
||
}
|
||
}
|