Skip to content

Commit a2e22ae

Browse files
committed
improvement
1 parent c1ab9c4 commit a2e22ae

File tree

9 files changed

+226
-144
lines changed

9 files changed

+226
-144
lines changed

src/CoreValidator.php

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,6 @@ public function add($name, $rule, $message = '', $when = null)
391391
if (!empty($message)) {
392392
$this->_messages[$messageRule] = $message;
393393
}
394-
395394
$this->_lastField = $name;
396395
return $this;
397396
}
@@ -765,20 +764,21 @@ public function image($name, $message = '', $when = null)
765764
* @param string $message
766765
* @param null $when
767766
* @return CoreValidator
767+
*
768+
* all time table or model full name
769+
*
770+
* $params = 'table'
771+
* $params = ['table', 'column']
772+
* $params = ['table', 'column', 'connection']
773+
*
774+
* if 'name' ends with '_id' auto 'column' => id
768775
*/
769776
public function exists($name, $params = [], $message = '', $when = null)
770777
{
771-
$this->makeArray($params);
772-
773-
$model = array_shift($params);
774-
$table = class_exists($model) ? app($model)->getTable() : $model;
775-
$column = !empty($params) ? array_shift($params) : $name;
776-
$connection = !empty($params) ? array_shift($params) : '';
777-
778-
$ruleStr = $connection ? $connection . '.' : '';
779-
$ruleStr .= $table . ',' . $column;
780-
781-
return $this->fixRuleStructure($name, 'exists', $ruleStr, $message, $when);
778+
if (empty($message)) {
779+
$message = 'Invalid argument is supplied';
780+
}
781+
return $this->fixRuleStructure($name, 'exists_db', $params, $message, $when);
782782
}
783783

784784
/**
@@ -787,10 +787,20 @@ public function exists($name, $params = [], $message = '', $when = null)
787787
* @param string $message
788788
* @param null $when
789789
* @return CoreValidator
790+
*
791+
* all time table or model full name
792+
*
793+
* $params = 'table'
794+
* $params = ['table']
795+
* $params = ['table', 'column']
796+
* $params = ['table', 'column', 'connection']
790797
*/
791798
public function multiExists($name, $params = [], $message = '', $when = null)
792799
{
793-
return $this->fixRuleStructure($name, 'multiExists', $params, $message, $when);
800+
if (empty($message)) {
801+
$message = 'Invalid argument is supplied';
802+
}
803+
return $this->fixRuleStructure($name, 'multi_exists', $params, $message, $when);
794804
}
795805

796806
/**
@@ -800,14 +810,27 @@ public function multiExists($name, $params = [], $message = '', $when = null)
800810
* @param null $when
801811
* @return CoreValidator
802812
*
803-
* [class, ['column' => value]]
804-
* [class, column1, ['column2' => value2]]
805-
* [class, column1, ['column2' => value2, column3 => value3]]
806-
* [class, column1, ['column2' => value2], [column3 => value3]]
813+
* all time table or model full name
814+
*
815+
* $params = ['table', ['column' => value]]
816+
* $params = ['table', 'column', ['column1' => value1]]
817+
* $params = ['table', 'column', 'connection', ['column1' => value1]]
818+
*
819+
* $params = ['table', ['column1' => 'value1', 'column2' => 'value2']]
820+
* $params = ['table', 'column', ['column1' => 'value1', 'column2' => 'value2']]
821+
* $params = ['table', 'column', 'connection', ['column1' => 'value1', 'column2' => 'value2']]
822+
*
823+
* $params = ['table', ['column1' => 'value1'], ['column2' => 'value2']]
824+
* $params = ['table', 'column', ['column1' => 'value1'], ['column2' => 'value2']]
825+
* $params = ['table', 'column', 'connection', ['column1' => 'value1'], ['column2' => 'value2']]
826+
*
807827
*/
808828
public function existsIf($name, $params = [], $message = '', $when = null)
809829
{
810-
return $this->fixDbIfRuleStructure($name, 'existsIf', $params, $message, $when);
830+
if (empty($message)) {
831+
$message = 'Invalid argument is supplied';
832+
}
833+
return $this->fixDbIfRuleStructure($name, 'exists_if', $params, $message, $when);
811834
}
812835

813836
/**
@@ -816,10 +839,15 @@ public function existsIf($name, $params = [], $message = '', $when = null)
816839
* @param string $message
817840
* @param null $when
818841
* @return CoreValidator
842+
*
843+
* parameters see exist if
819844
*/
820845
public function multiExistsIf($name, $params = [], $message = '', $when = null)
821846
{
822-
return $this->fixDbIfRuleStructure($name, 'multiExistsIf', $params, $message, $when);
847+
if (empty($message)) {
848+
$message = 'Invalid argument is supplied';
849+
}
850+
return $this->fixDbIfRuleStructure($name, 'multi_exists_if', $params, $message, $when);
823851
}
824852

825853
/**

src/LaraValidator.php

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -36,28 +36,6 @@ public function __construct(CoreValidator $validator)
3636
$this->validator = $validator;
3737
}
3838

39-
// public function setCustomRule($rule, $ruleName = '')
40-
// {
41-
// if (!ends_with($rule, 'Rule')) {
42-
// //TODO not show exception
43-
// throw new \Exception('The Rule Must be ends with "Rule"');
44-
// }
45-
//
46-
// $refl = new \ReflectionClass($rule);
47-
// if (!in_array(RuleInterface::class, $refl->getInterfaceNames())) {
48-
// //TODO not show exception
49-
// throw new \Exception(sprintf('The Rule Must be implements %s interface', RuleInterface::class));
50-
// }
51-
//
52-
// if (empty($ruleName)) {
53-
// $ruleName = last(explode(DIRECTORY_SEPARATOR, $rule));
54-
// $ruleName = str_replace('Rule', '', $ruleName);
55-
// $ruleName = lcfirst($ruleName);
56-
// }
57-
//
58-
// Validator::extend($ruleName, $rule . '@get');
59-
// }
60-
6139
/**
6240
*
6341
*/
@@ -97,7 +75,6 @@ public function isValid(array $attributes, $options = [])
9775
$this->setErrors(null);
9876
return true;
9977
}
100-
10178
$this->setErrors($v->errors());
10279
return false;
10380
}

src/Rules/DbRule.php

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
<?php
2+
namespace LaraValidation\Rules;
3+
4+
use Illuminate\Support\Facades\DB;
5+
use LaraValidation\Contracts\RuleInterface;
6+
use LaraValidation\Traits\DBParametersGetter;
7+
use MyDevData\Models\Staff\Staff;
8+
9+
class DbRule {
10+
11+
/**
12+
* @param $attribute
13+
* @param $value
14+
* @param $parameters
15+
* @param $validator
16+
* @return bool
17+
*/
18+
protected static function getForExists($attribute, $value, $parameters, $validator, $message, $isMulti = false)
19+
{
20+
if (!isset($value)) {
21+
return true;
22+
}
23+
24+
if (empty($parameters[0])) {
25+
throw new \InvalidArgumentException(sprintf('Second parameter is required for %s validation', $message));
26+
}
27+
28+
$tableParam = array_shift($parameters);
29+
$columnParam = array_shift($parameters);
30+
$connectionParam = array_shift($parameters);
31+
32+
$connection = !empty($connectionParam) ? $connectionParam : config('database.default');
33+
$column = ends_with($attribute, ['_id', '_ids']) ? 'id' : $attribute;
34+
35+
if (!empty($columnParam)) {
36+
$column = $columnParam;
37+
}
38+
39+
$query = self::getQueryBased($tableParam, $column, $connection);
40+
41+
return self::fixIsMulti($isMulti, $query, $column, $value);
42+
}
43+
44+
45+
/**
46+
* @param $attribute
47+
* @param $value
48+
* @param $parameters
49+
* @param $validator
50+
* @param $message
51+
* @param bool $isMulti
52+
* @return bool
53+
* @throws \Exception
54+
*/
55+
protected static function getForExistsIf($attribute, $value, $parameters, $validator, $message, $isMulti = false)
56+
{
57+
if (!isset($value)) {
58+
return true;
59+
}
60+
61+
if (empty($parameters[0])) {
62+
throw new \InvalidArgumentException(sprintf('Second parameter is required for %s validation', $message));
63+
}
64+
65+
$tableParam = array_shift($parameters);
66+
$columnParam = array_shift($parameters);
67+
$connectionParam = array_shift($parameters);
68+
69+
$connection = config('database.default');
70+
self::fixField($connection, $parameters, $connectionParam);
71+
72+
$column = ends_with($attribute, ['_id', '_ids']) ? 'id' : $attribute;
73+
self::fixField($column, $parameters, $columnParam);
74+
75+
$conditions = [];
76+
foreach ($parameters as $parameter) {
77+
$condition = explode('=>', $parameter);
78+
$conditions[array_shift($condition)] = array_shift($condition);
79+
}
80+
81+
if (empty($conditions)) {
82+
throw new \Exception('The Params must be contain [attribute => value] value');
83+
}
84+
85+
$query = self::getQueryBased($tableParam, $column, $connection);
86+
$query->where($conditions);
87+
return self::fixIsMulti($isMulti, $query, $column, $value);
88+
}
89+
90+
/**
91+
* @param $field
92+
* @param $parameters
93+
* @param $param
94+
*/
95+
protected static function fixField(&$field, &$parameters, $param)
96+
{
97+
if (!empty($param)) {
98+
if (str_contains($param, '=>')) {
99+
array_unshift($parameters, $param);
100+
} else {
101+
$field = $param;
102+
}
103+
}
104+
}
105+
106+
/**
107+
* @param $tableParam
108+
* @param $column
109+
* @param $connection
110+
* @return mixed
111+
*/
112+
protected static function getQueryBased($tableParam, $column, $connection)
113+
{
114+
if (class_exists($tableParam)) {
115+
$model = app($tableParam);
116+
$model->setConnection($connection);
117+
$query = $model->newQuery();
118+
} else {
119+
$query = DB::connection($connection)->table($tableParam)->select($column);
120+
}
121+
122+
return $query;
123+
}
124+
125+
/**
126+
* @param $isMulti
127+
* @param $query
128+
* @param $column
129+
* @param $value
130+
* @return bool
131+
*/
132+
protected static function fixIsMulti($isMulti, $query, $column, $value)
133+
{
134+
135+
if (!$isMulti) {
136+
return $query->where($column, $value)->count();
137+
}
138+
139+
if (!is_array($value )) {
140+
$value = [$value ];
141+
}
142+
143+
$count = $query->whereIn($column, $value)->count();
144+
return ($count == count($value)) ? true : false;
145+
}
146+
147+
}

src/Rules/ExistsDbRule.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
namespace LaraValidation\Rules;
3+
4+
use LaraValidation\Contracts\RuleInterface;
5+
6+
class ExistsDbRule extends DbRule implements RuleInterface
7+
{
8+
9+
/**
10+
* @param $attribute
11+
* @param $value
12+
* @param $parameters
13+
* @param $validator
14+
* @return bool
15+
*/
16+
public static function get($attribute, $value, $parameters, $validator)
17+
{
18+
return self::getForExists($attribute, $value, $parameters, $validator, 'exists');
19+
}
20+
21+
}

src/Rules/ExistsIfRule.php

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33

44
use Illuminate\Support\Facades\DB;
55
use LaraValidation\Contracts\RuleInterface;
6-
use LaraValidation\Traits\DBParameterGetter;
6+
use LaraValidation\Traits\DBParametersGetter;
77

8-
class ExistsIfRule implements RuleInterface
8+
class ExistsIfRule extends DbRule implements RuleInterface
99
{
10-
use DBParameterGetter;
1110
/**
1211
* @param $attribute
1312
* @param $value
@@ -17,20 +16,7 @@ class ExistsIfRule implements RuleInterface
1716
*/
1817
public static function get($attribute, $value, $parameters, $validator)
1918
{
20-
// TODO discuss when $value is empty this method not called
21-
if (!isset($value)) {
22-
return true;
23-
}
24-
25-
if (empty($parameters[0])) {
26-
throw new \InvalidArgumentException('Second parameter is required for existsIf validation');
27-
}
28-
29-
list($table, $column, $connection, $conditions) = static::getParameters ($attribute, $parameters);
30-
$conditions[$column] = $value;
31-
$query = DB::connection($connection)->table($table)->select($column)->where($conditions);
32-
33-
return $query->count();
19+
return self::getForExistsIf($attribute, $value, $parameters, $validator, 'exists');
3420
}
3521

3622
}

src/Rules/MultiExistsIfRule.php

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
<?php
22
namespace LaraValidation\Rules;
33

4-
use Illuminate\Support\Facades\DB;
54
use LaraValidation\Contracts\RuleInterface;
6-
use LaraValidation\Traits\DBParameterGetter;
75

8-
class MultiExistsIfRule implements RuleInterface
6+
class MultiExistsIfRule extends DbRule implements RuleInterface
97
{
10-
use DBParameterGetter;
118

129
/**
1310
* @param $attribute
@@ -18,23 +15,7 @@ class MultiExistsIfRule implements RuleInterface
1815
*/
1916
public static function get($attribute, $value, $parameters, $validator)
2017
{
21-
// TODO discuss when $value is empty this method not called
22-
if (!isset($value)) {
23-
return true;
24-
}
25-
26-
if (!is_array($value)) {
27-
$value = [$value];
28-
}
29-
30-
if (empty($parameters[0])) {
31-
throw new \InvalidArgumentException('Second parameter is required for existsIf validation');
32-
}
33-
34-
list($table, $column, $connection, $conditions) = static::getParameters ($attribute, $parameters);
35-
$query = DB::connection($connection)->table($table)->select($column)->where($conditions)->whereIn($column, $value);
36-
37-
return $query->count();
18+
return self::getForExistsIf($attribute, $value, $parameters, $validator, 'multiExistsIf', true);
3819
}
3920

4021
}

0 commit comments

Comments
 (0)