/home/mip/www/img/credit/datatables/Remote.tar
Resolver.php 0000644 00000005744 15152100622 0007062 0 ustar 00 <?php
namespace Proengsoft\JsValidation\Remote;
use Illuminate\Contracts\Validation\Factory as ValidationFactory;
use Illuminate\Support\Arr;
use Illuminate\Validation\Validator as BaseValidator;
use Proengsoft\JsValidation\Support\AccessProtectedTrait;
class Resolver
{
use AccessProtectedTrait;
/**
* @var \Closure
*/
protected $resolver;
/**
* @var \Illuminate\Contracts\Validation\Factory
*/
protected $factory;
/**
* Whether to escape validation messages.
*
* @var bool
*/
protected $escape;
/**
* RemoteValidator constructor.
*
* @param \Illuminate\Contracts\Validation\Factory $factory
* @param bool $escape
*/
public function __construct(ValidationFactory $factory, $escape = false)
{
$this->factory = $factory;
$this->resolver = $this->getProtected($factory, 'resolver');
$this->escape = $escape;
}
/**
* Closure used to resolve Validator instance.
*
* @param $field
* @return \Closure
*/
public function resolver($field)
{
return function ($translator, $data, $rules, $messages, $customAttributes) use ($field) {
return $this->resolve($translator, $data, $rules, $messages, $customAttributes, $field);
};
}
/**
* Resolves Validator instance.
*
* @param $translator
* @param $data
* @param $rules
* @param $messages
* @param $customAttributes
* @param $field
* @return \Illuminate\Validation\Validator
*/
protected function resolve($translator, $data, $rules, $messages, $customAttributes, $field)
{
$validateAll = Arr::get($data, $field.'_validate_all', false);
$validationRule = 'bail|'.Validator::EXTENSION_NAME.':'.$validateAll;
$rules = [$field => $validationRule] + $rules;
$validator = $this->createValidator($translator, $data, $rules, $messages, $customAttributes);
return $validator;
}
/**
* Create new validator instance.
*
* @param $translator
* @param $data
* @param $rules
* @param $messages
* @param $customAttributes
* @return \Illuminate\Validation\Validator
*/
protected function createValidator($translator, $data, $rules, $messages, $customAttributes)
{
if (is_null($this->resolver)) {
return new BaseValidator($translator, $data, $rules, $messages, $customAttributes);
}
return call_user_func($this->resolver, $translator, $data, $rules, $messages, $customAttributes);
}
/**
* Closure used to trigger JsValidations.
*
* @return \Closure
*/
public function validatorClosure()
{
return function ($attribute, $value, $parameters, BaseValidator $validator) {
$remoteValidator = new Validator($validator, $this->escape);
$remoteValidator->validate($value, $parameters);
return $attribute;
};
}
}
Validator.php 0000644 00000011500 15152100622 0007171 0 ustar 00 <?php
namespace Proengsoft\JsValidation\Remote;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Arr;
use Illuminate\Validation\ValidationException;
use Illuminate\Validation\ValidationRuleParser;
use Illuminate\Validation\Validator as BaseValidator;
use Proengsoft\JsValidation\Support\AccessProtectedTrait;
use Proengsoft\JsValidation\Support\RuleListTrait;
class Validator
{
use AccessProtectedTrait;
use RuleListTrait;
/**
* Validator extension name.
*/
const EXTENSION_NAME = 'jsvalidation';
/**
* @var \Illuminate\Validation\Validator
*/
protected $validator;
/**
* Whether to escape validation messages.
*
* @var bool
*/
protected $escape;
/**
* RemoteValidator constructor.
*
* @param \Illuminate\Validation\Validator $validator
* @param bool $escape
*/
public function __construct(BaseValidator $validator, $escape = false)
{
$this->validator = $validator;
$this->escape = $escape;
}
/**
* Validate request.
*
* @param $field
* @param $parameters
* @return void
*
* @throws \Illuminate\Validation\ValidationException
*/
public function validate($field, $parameters = [])
{
$attribute = $this->parseAttributeName($field);
$validationParams = $this->parseParameters($parameters);
$validationResult = $this->validateJsRemoteRequest($attribute, $validationParams);
$this->throwValidationException($validationResult, $this->validator);
}
/**
* Throw the failed validation exception.
*
* @param mixed $result
* @param \Illuminate\Validation\Validator $validator
* @return void
*
* @throws \Illuminate\Validation\ValidationException|\Illuminate\Http\Exceptions\HttpResponseException
*/
protected function throwValidationException($result, $validator)
{
$response = new JsonResponse($result, 200);
if ($result !== true && class_exists(ValidationException::class)) {
throw new ValidationException($validator, $response);
}
throw new HttpResponseException($response);
}
/**
* Parse Validation input request data.
*
* @param $data
* @return array
*/
protected function parseAttributeName($data)
{
parse_str($data, $attrParts);
$attrParts = is_null($attrParts) ? [] : $attrParts;
$newAttr = array_keys(Arr::dot($attrParts));
return array_pop($newAttr);
}
/**
* Parse Validation parameters.
*
* @param $parameters
* @return array
*/
protected function parseParameters($parameters)
{
$newParams = ['validate_all' => false];
if (isset($parameters[0])) {
$newParams['validate_all'] = ($parameters[0] === 'true') ? true : false;
}
return $newParams;
}
/**
* Validate remote Javascript Validations.
*
* @param $attribute
* @param array $parameters
* @return array|bool
*/
protected function validateJsRemoteRequest($attribute, $parameters)
{
$this->setRemoteValidation($attribute, $parameters['validate_all']);
$validator = $this->validator;
if ($validator->passes()) {
return true;
}
$messages = $validator->messages()->get($attribute);
if ($this->escape) {
foreach ($messages as $key => $value) {
$messages[$key] = e($value);
}
}
return $messages;
}
/**
* Sets data for validate remote rules.
*
* @param $attribute
* @param bool $validateAll
* @return void
*/
protected function setRemoteValidation($attribute, $validateAll = false)
{
$validator = $this->validator;
$rules = $validator->getRules();
$rules = isset($rules[$attribute]) ? $rules[$attribute] : [];
if (in_array('no_js_validation', $rules)) {
$validator->setRules([$attribute => []]);
return;
}
if (! $validateAll) {
$rules = $this->purgeNonRemoteRules($rules, $validator);
}
$validator->setRules([$attribute => $rules]);
}
/**
* Remove rules that should not be validated remotely.
*
* @param $rules
* @param BaseValidator $validator
* @return mixed
*/
protected function purgeNonRemoteRules($rules, $validator)
{
$protectedValidator = $this->createProtectedCaller($validator);
foreach ($rules as $i => $rule) {
$parsedRule = ValidationRuleParser::parse($rule);
if (! $this->isRemoteRule($parsedRule[0])) {
unset($rules[$i]);
}
}
return $rules;
}
}
FormRequest.php 0000644 00000003430 15152100622 0007523 0 ustar 00 <?php
namespace Proengsoft\JsValidation\Remote;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest as Request;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Illuminate\Validation\ValidationException;
class FormRequest extends Request
{
/**
* Field to identify requests originating from this library.
*/
const JS_VALIDATION_FIELD = '__proengsoft_form_request';
/**
* Validate the class instance.
*
* @return void
*/
public function validateResolved()
{
parent::validateResolved();
// BC for Laravel versions prior to 6.x.
$this->passedValidation();
}
/**
* Handle a passed validation attempt.
*
* @return void
*/
protected function passedValidation()
{
if ($this->isJsValidation()) {
throw new HttpResponseException(
new JsonResponse(true, 200)
);
}
parent::passedValidation();
}
/**
* Handle a failed validation attempt.
*
* @param \Illuminate\Contracts\Validation\Validator $validator
* @return void
*
* @throws \Illuminate\Validation\ValidationException
*/
protected function failedValidation(Validator $validator)
{
if ($this->isJsValidation()) {
throw new ValidationException(
$validator,
new JsonResponse($validator->errors()->messages(), 200)
);
}
parent::failedValidation($validator);
}
/**
* Whether the request originated from laravel-jsvalidation.
*
* @return bool
*/
private function isJsValidation()
{
return $this->has(static::JS_VALIDATION_FIELD);
}
}