api de gestion de ticket, basé sur php-crud-api. Le but est de décorrélé les outils de gestion des données, afin
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SanitationMiddleware.php 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <?php
  2. namespace Tqdev\PhpCrudApi\Middleware;
  3. use Psr\Http\Message\ResponseInterface;
  4. use Psr\Http\Message\ServerRequestInterface;
  5. use Psr\Http\Server\RequestHandlerInterface;
  6. use Tqdev\PhpCrudApi\Column\Reflection\ReflectedTable;
  7. use Tqdev\PhpCrudApi\Column\ReflectionService;
  8. use Tqdev\PhpCrudApi\Controller\Responder;
  9. use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
  10. use Tqdev\PhpCrudApi\Middleware\Router\Router;
  11. use Tqdev\PhpCrudApi\RequestUtils;
  12. class SanitationMiddleware extends Middleware
  13. {
  14. private $reflection;
  15. public function __construct(Router $router, Responder $responder, array $properties, ReflectionService $reflection)
  16. {
  17. parent::__construct($router, $responder, $properties);
  18. $this->reflection = $reflection;
  19. }
  20. private function callHandler($handler, $record, string $operation, ReflectedTable $table) /*: object */
  21. {
  22. $context = (array) $record;
  23. $tableName = $table->getName();
  24. foreach ($context as $columnName => &$value) {
  25. if ($table->hasColumn($columnName)) {
  26. $column = $table->getColumn($columnName);
  27. $value = call_user_func($handler, $operation, $tableName, $column->serialize(), $value);
  28. }
  29. }
  30. return (object) $context;
  31. }
  32. public function process(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
  33. {
  34. $operation = RequestUtils::getOperation($request);
  35. if (in_array($operation, ['create', 'update', 'increment'])) {
  36. $tableName = RequestUtils::getPathSegment($request, 2);
  37. if ($this->reflection->hasTable($tableName)) {
  38. $record = $request->getParsedBody();
  39. if ($record !== null) {
  40. $handler = $this->getProperty('handler', '');
  41. if ($handler !== '') {
  42. $table = $this->reflection->getTable($tableName);
  43. if (is_array($record)) {
  44. foreach ($record as &$r) {
  45. $r = $this->callHandler($handler, $r, $operation, $table);
  46. }
  47. } else {
  48. $record = $this->callHandler($handler, $record, $operation, $table);
  49. }
  50. $request = $request->withParsedBody($record);
  51. }
  52. }
  53. }
  54. }
  55. return $next->handle($request);
  56. }
  57. }