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.

ValidationMiddleware.php 3.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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\Record\ErrorCode;
  12. use Tqdev\PhpCrudApi\RequestUtils;
  13. class ValidationMiddleware extends Middleware
  14. {
  15. private $reflection;
  16. public function __construct(Router $router, Responder $responder, array $properties, ReflectionService $reflection)
  17. {
  18. parent::__construct($router, $responder, $properties);
  19. $this->reflection = $reflection;
  20. }
  21. private function callHandler($handler, $record, string $operation, ReflectedTable $table) /*: ResponseInterface?*/
  22. {
  23. $context = (array) $record;
  24. $details = array();
  25. $tableName = $table->getName();
  26. foreach ($context as $columnName => $value) {
  27. if ($table->hasColumn($columnName)) {
  28. $column = $table->getColumn($columnName);
  29. $valid = call_user_func($handler, $operation, $tableName, $column->serialize(), $value, $context);
  30. if ($valid !== true && $valid !== '') {
  31. $details[$columnName] = $valid;
  32. }
  33. }
  34. }
  35. if (count($details) > 0) {
  36. return $this->responder->error(ErrorCode::INPUT_VALIDATION_FAILED, $tableName, $details);
  37. }
  38. return null;
  39. }
  40. public function process(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
  41. {
  42. $operation = RequestUtils::getOperation($request);
  43. if (in_array($operation, ['create', 'update', 'increment'])) {
  44. $tableName = RequestUtils::getPathSegment($request, 2);
  45. if ($this->reflection->hasTable($tableName)) {
  46. $record = $request->getParsedBody();
  47. if ($record !== null) {
  48. $handler = $this->getProperty('handler', '');
  49. if ($handler !== '') {
  50. $table = $this->reflection->getTable($tableName);
  51. if (is_array($record)) {
  52. foreach ($record as $r) {
  53. $response = $this->callHandler($handler, $r, $operation, $table);
  54. if ($response !== null) {
  55. return $response;
  56. }
  57. }
  58. } else {
  59. $response = $this->callHandler($handler, $record, $operation, $table);
  60. if ($response !== null) {
  61. return $response;
  62. }
  63. }
  64. }
  65. }
  66. }
  67. }
  68. return $next->handle($request);
  69. }
  70. }