<?php namespace FluentForm\Framework\Validator; class ValidationRuleParser { /** * The data being validated. * * @var array */ public $data; /** * Create a new validation rule parser. * * @param array $data * * @return void */ public function __construct(array $data) { $this->data = $data; } /** * Parse the human-friendly rules into a full rules array for the validator. * * @param $rules * * @return array */ public function explode($rules) { return $this->explodeRules($rules); } /** * Explode the rules into an array of explicit rules. * * @param array $rules * * @return array */ protected function explodeRules($rules) { foreach ($rules as $attribute => $rule) { if(function_exists('mb_strpos')) { $result = mb_strpos($attribute, '*'); } else { $result = strpos($attribute, '*'); } if ($result) { $rules = $this->explodeWildcardRules($rules, $attribute, [$rule]); unset($rules[$attribute]); } else { $rules[$attribute] = $this->explodeExplicitRule($rule); } } return $rules; } /** * Explode the explicit rule into an array if necessary. * * @param mixed $rule * * @return array */ protected function explodeExplicitRule($rule) { if (is_string($rule)) { return explode('|', $rule); } var_dump('check laravel'); } /** * Define a set of rules that apply to each element in an array attribute. * * @param array $results * @param string $attribute * @param string|array $rules * * @return array */ protected function explodeWildcardRules($results, $attribute, $rules) { $pattern = str_replace('\*', '[^\.]*', preg_quote($attribute)); $data = ValidationData::initializeAndGatherData($attribute, $this->data); foreach ($data as $key => $value) { if (substr($key, 0, strlen($attribute)) === $attribute || (bool) preg_match('/^'.$pattern.'\z/', $key)) { foreach ((array) $rules as $rule) { $results = $this->mergeRules($results, $key, $rule); } } } return $results; } /** * Merge additional rules into a given attribute(s). * * @param array $results * @param string|array $attribute * @param string|array $rules * * @return array */ public function mergeRules($results, $attribute, $rules = []) { if (is_array($attribute)) { foreach ((array) $attribute as $innerAttribute => $innerRules) { $results = $this->mergeRulesForAttribute($results, $innerAttribute, $innerRules); } return $results; } return $this->mergeRulesForAttribute( $results, $attribute, $rules ); } /** * Merge additional rules into a given attribute. * * @param array $results * @param string $attribute * @param string|array $rules * * @return array */ protected function mergeRulesForAttribute($results, $attribute, $rules) { $array = $this->explodeRules([$rules]); $merge = reset($array); $results[$attribute] = array_merge( isset($results[$attribute]) ? $this->explodeExplicitRule($results[$attribute]) : [], $merge ); return $results; } /** * Extract the rule name and parameters from a rule. * * @param $rule * * @return array */ public static function parse($rule) { $parameters = []; if (strpos($rule, ':') !== false) { list($rule, $parameter) = explode(':', $rule, 2); $parameters = str_getcsv($parameter); } return [trim($rule), $parameters]; } }