AbstractPostSerializable.php 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <?php
  2. namespace DNB;
  3. use ReflectionClass;
  4. abstract class AbstractPostSerializable implements PostSerializableInterface {
  5. public static function fromPostParams(array $post): PostSerializableInterface {
  6. $vars = [];
  7. foreach (static::getPostParams() as $key => $param) {
  8. $vars[$key] = isset($post[$key]) && ((bool)$post[$key]) && strtolower((string)$post[$key]) != "off" ? htmlspecialchars($post[$key], ENT_QUOTES | ENT_SUBSTITUTE) : null;
  9. if ($vars[$key] == null && $param->required)
  10. throw new \Symfony\Component\HttpClient\Exception\InvalidArgumentException(
  11. sprintf("Missing required argmuent: %s", $key)
  12. );
  13. }
  14. return new static(...array_values($vars));
  15. }
  16. protected static function removePrefix(string $param): string {
  17. return ltrim(strstr($param, '-'), '-');
  18. }
  19. final public static function getPostParams(bool $short = false): array {
  20. $vars = [];
  21. foreach ((new ReflectionClass(static::class))->getConstructor()->getParameters() as $param) {
  22. if ($short)
  23. $vars[$param->getName()] = (object)[
  24. 'type' => !is_null($param->getType()) ? $param->getType()->getName() : 'mixed',
  25. 'required' => !($param->isOptional() || $param->allowsNull())
  26. ];
  27. else
  28. $vars[sprintf('%s-%s', static::namespace(), $param->getName())] = (object)[
  29. 'type' => !is_null($param->getType()) ? $param->getType()->getName() : 'mixed',
  30. 'required' => !($param->isOptional() || $param->allowsNull())
  31. ];
  32. }
  33. return $vars;
  34. }
  35. public static function namespace(): string {
  36. return strtolower(basename(str_replace('\\', DIRECTORY_SEPARATOR, static::class)));
  37. }
  38. }