Skip to content

Commit 31508dc

Browse files
committed
Redefine ErrorBag class
1 parent 9fe4162 commit 31508dc

File tree

4 files changed

+442
-70
lines changed

4 files changed

+442
-70
lines changed

src/ErrorBag.php

Lines changed: 103 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -26,58 +26,132 @@ public function count()
2626
return count($this->all());
2727
}
2828

29-
public function first($key)
29+
public function has($key)
3030
{
31-
if (empty($this->messages[$key])) return null;
32-
return array_values($this->messages[$key])[0];
31+
list($key, $ruleName) = $this->parsekey($key);
32+
if ($this->isWildcardKey($key)) {
33+
$messages = $this->filterMessagesForWildcardKey($key, $ruleName);
34+
return count(Helper::arrayDot($messages)) > 0;
35+
} else {
36+
$messages = isset($this->messages[$key])? $this->messages[$key] : null;
37+
38+
if (!$ruleName) {
39+
return !empty($messages);
40+
} else {
41+
return !empty($messages) AND isset($messages[$ruleName]);
42+
}
43+
}
3344
}
3445

35-
public function last($key)
46+
public function first($key)
3647
{
37-
if (empty($this->messages[$key])) return null;
38-
return array_values($this->messages[$key])[count($this->messages[$key])-1];
48+
list($key, $ruleName) = $this->parsekey($key);
49+
if ($this->isWildcardKey($key)) {
50+
$messages = $this->filterMessagesForWildcardKey($key, $ruleName);
51+
$flattenMessages = Helper::arrayDot($messages);
52+
return array_shift($flattenMessages);
53+
} else {
54+
$keyMessages = isset($this->messages[$key])? $this->messages[$key] : [];
55+
56+
if (empty($keyMessages)) {
57+
return null;
58+
}
59+
60+
if ($ruleName) {
61+
return isset($keyMessages[$ruleName])? $keyMessages[$ruleName] : null;
62+
} else {
63+
return array_shift($keyMessages);
64+
}
65+
}
3966
}
4067

41-
public function get($key, $rule)
68+
public function get($key, $format = ':message')
4269
{
43-
if (empty($this->messages[$key])) return null;
44-
if (empty($this->messages[$key][$rule])) return null;
45-
return $this->messages[$key][$rule];
70+
list($key, $ruleName) = $this->parsekey($key);
71+
$results = [];
72+
if ($this->isWildcardKey($key)) {
73+
$messages = $this->filterMessagesForWildcardKey($key, $ruleName);
74+
foreach($messages as $explicitKey => $keyMessages) {
75+
foreach ($keyMessages as $rule => $message) {
76+
$results[$explicitKey][$rule] = $this->formatMessage($message, $format);
77+
}
78+
}
79+
} else {
80+
$keyMessages = isset($this->messages[$key])? $this->messages[$key] : [];
81+
foreach($keyMessages as $rule => $message) {
82+
if ($ruleName AND $ruleName != $rule) continue;
83+
$results[$rule] = $this->formatMessage($message, $format);
84+
}
85+
}
86+
87+
return $results;
4688
}
4789

4890
public function all($format = ':message')
4991
{
50-
$messages = [];
51-
foreach($this->messages as $key => $keyMessages) {
52-
foreach($keyMessages as $msg) {
53-
$messages[] = str_replace(':message', $format, $msg);
92+
$messages = $this->messages;
93+
$results = [];
94+
foreach($messages as $key => $keyMessages) {
95+
foreach($keyMessages as $message) {
96+
$results[] = $this->formatMessage($message, $format);
5497
}
5598
}
99+
return $results;
100+
}
101+
102+
public function firstOfAll($format = ':message')
103+
{
104+
$messages = $this->messages;
105+
$results = [];
106+
foreach($messages as $key => $keyMessages) {
107+
$results[] = $this->formatMessage(array_shift($messages[$key]), $format);
108+
}
109+
return $results;
110+
}
56111

57-
return $messages;
112+
public function toArray()
113+
{
114+
return $this->messages;
58115
}
59116

60-
public function implode($glue, $format = ':message')
117+
protected function parseKey($key)
61118
{
62-
return implode($glue, $this->all($format));
119+
$expl = explode(':', $key, 2);
120+
$key = $expl[0];
121+
$ruleName = isset($expl[1])? $expl[1] : null;
122+
return [$key, $ruleName];
63123
}
64124

65-
public function firstOfAll()
125+
protected function isWildcardKey($key)
66126
{
67-
$messages = [];
68-
foreach($this->messages as $key => $keyMessages) {
69-
$messages[] = $this->first($key);
70-
}
71-
return $messages;
127+
return false !== strpos($key, '*');
72128
}
73129

74-
public function lastOfAll()
130+
protected function filterMessagesForWildcardKey($key, $ruleName = null)
75131
{
76-
$messages = [];
77-
foreach($this->messages as $key => $keyMessages) {
78-
$messages[] = $this->last($key);
132+
$messages = $this->messages;
133+
$pattern = preg_quote($key, '#');
134+
$pattern = str_replace('\*', '.*', $pattern);
135+
136+
$filteredMessages = [];
137+
138+
foreach ($messages as $k => $keyMessages) {
139+
if ((bool) preg_match('#^'.$pattern.'\z#u', $k) === false) {
140+
continue;
141+
}
142+
143+
foreach($keyMessages as $rule => $message) {
144+
if ($ruleName AND $rule != $ruleName) continue;
145+
$filteredMessages[$k][$rule] = $message;
146+
}
79147
}
80-
return $messages;
148+
149+
return $filteredMessages;
150+
}
151+
152+
protected function formatMessage($message, $format)
153+
{
154+
return str_replace(':message', $message, $format);
81155
}
82156

83-
}
157+
}

src/Helper.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,30 @@
55
class Helper
66
{
77

8+
/**
9+
* Determine if a given string matches a given pattern.
10+
* Adapted from: https://github.com/illuminate/support/blob/v5.3.23/Str.php#L119
11+
*
12+
* @param string $pattern
13+
* @param string $value
14+
* @return bool
15+
*/
16+
public static function strIs($pattern, $value)
17+
{
18+
if ($pattern == $value) {
19+
return true;
20+
}
21+
22+
$pattern = preg_quote($pattern, '#');
23+
24+
// Asterisks are translated into zero-or-more regular expression wildcards
25+
// to make it convenient to check if the strings starts with the given
26+
// pattern such as "library/*", making any string check convenient.
27+
$pattern = str_replace('\*', '.*', $pattern);
28+
29+
return (bool) preg_match('#^'.$pattern.'\z#u', $value);
30+
}
31+
832
/**
933
* Check if an item or items exist in an array using "dot" notation.
1034
* Adapted from: https://github.com/illuminate/support/blob/v5.3.23/Arr.php#L81

0 commit comments

Comments
 (0)