InvokableValidationRule.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. namespace Illuminate\Validation;
  3. use Illuminate\Contracts\Validation\DataAwareRule;
  4. use Illuminate\Contracts\Validation\ImplicitRule;
  5. use Illuminate\Contracts\Validation\InvokableRule;
  6. use Illuminate\Contracts\Validation\Rule;
  7. use Illuminate\Contracts\Validation\ValidationRule;
  8. use Illuminate\Contracts\Validation\ValidatorAwareRule;
  9. use Illuminate\Translation\CreatesPotentiallyTranslatedStrings;
  10. class InvokableValidationRule implements Rule, ValidatorAwareRule
  11. {
  12. use CreatesPotentiallyTranslatedStrings;
  13. /**
  14. * The invokable that validates the attribute.
  15. *
  16. * @var \Illuminate\Contracts\Validation\ValidationRule|\Illuminate\Contracts\Validation\InvokableRule
  17. */
  18. protected $invokable;
  19. /**
  20. * Indicates if the validation invokable failed.
  21. *
  22. * @var bool
  23. */
  24. protected $failed = false;
  25. /**
  26. * The validation error messages.
  27. *
  28. * @var array
  29. */
  30. protected $messages = [];
  31. /**
  32. * The current validator.
  33. *
  34. * @var \Illuminate\Validation\Validator
  35. */
  36. protected $validator;
  37. /**
  38. * The data under validation.
  39. *
  40. * @var array
  41. */
  42. protected $data = [];
  43. /**
  44. * Create a new explicit Invokable validation rule.
  45. *
  46. * @param \Illuminate\Contracts\Validation\ValidationRule|\Illuminate\Contracts\Validation\InvokableRule $invokable
  47. */
  48. protected function __construct(ValidationRule|InvokableRule $invokable)
  49. {
  50. $this->invokable = $invokable;
  51. }
  52. /**
  53. * Create a new implicit or explicit Invokable validation rule.
  54. *
  55. * @param \Illuminate\Contracts\Validation\ValidationRule|\Illuminate\Contracts\Validation\InvokableRule $invokable
  56. * @return \Illuminate\Validation\InvokableValidationRule
  57. */
  58. public static function make($invokable)
  59. {
  60. if ($invokable->implicit ?? false) {
  61. return new class($invokable) extends InvokableValidationRule implements ImplicitRule {
  62. };
  63. }
  64. return new InvokableValidationRule($invokable);
  65. }
  66. /**
  67. * Determine if the validation rule passes.
  68. *
  69. * @param string $attribute
  70. * @param mixed $value
  71. * @return bool
  72. */
  73. public function passes($attribute, $value)
  74. {
  75. $this->failed = false;
  76. if ($this->invokable instanceof DataAwareRule) {
  77. $this->invokable->setData($this->validator->getData());
  78. }
  79. if ($this->invokable instanceof ValidatorAwareRule) {
  80. $this->invokable->setValidator($this->validator);
  81. }
  82. $method = $this->invokable instanceof ValidationRule
  83. ? 'validate'
  84. : '__invoke';
  85. $this->invokable->{$method}($attribute, $value, function ($attribute, $message = null) {
  86. $this->failed = true;
  87. return $this->pendingPotentiallyTranslatedString($attribute, $message);
  88. });
  89. return ! $this->failed;
  90. }
  91. /**
  92. * Get the underlying invokable rule.
  93. *
  94. * @return \Illuminate\Contracts\Validation\ValidationRule|\Illuminate\Contracts\Validation\InvokableRule
  95. */
  96. public function invokable()
  97. {
  98. return $this->invokable;
  99. }
  100. /**
  101. * Get the validation error messages.
  102. *
  103. * @return array
  104. */
  105. public function message()
  106. {
  107. return $this->messages;
  108. }
  109. /**
  110. * Set the data under validation.
  111. *
  112. * @param array $data
  113. * @return $this
  114. */
  115. public function setData($data)
  116. {
  117. $this->data = $data;
  118. return $this;
  119. }
  120. /**
  121. * Set the current validator.
  122. *
  123. * @param \Illuminate\Validation\Validator $validator
  124. * @return $this
  125. */
  126. public function setValidator($validator)
  127. {
  128. $this->validator = $validator;
  129. return $this;
  130. }
  131. }