Skip to content

Commit 96202f7

Browse files
authored
Support model reference in validate statement to validate all columns (#197)
1 parent 2c0403f commit 96202f7

File tree

5 files changed

+146
-6
lines changed

5 files changed

+146
-6
lines changed

src/Generators/Statements/FormRequestGenerator.php

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,14 @@ private function buildRules(string $context, ValidateStatement $validateStatemen
8686
$qualifier = $context;
8787
}
8888

89-
$rules = $this->validationRules($qualifier, $column);
89+
$validationRules = $this->validationRules($qualifier, $column);
90+
91+
foreach ($validationRules as $name => $rule) {
92+
$formattedRule = implode("|", $rule);
93+
94+
$output .= self::INDENT . "'{$name}' => '{$formattedRule}'," . PHP_EOL;
95+
}
9096

91-
$output .= self::INDENT . "'{$column}' => '{$rules}'," . PHP_EOL;
9297
return $output;
9398
}, ''));
9499
}
@@ -129,13 +134,32 @@ private function validationRules(string $qualifier, string $column)
129134
/** @var \Blueprint\Models\Model $model */
130135
$model = $this->modelForContext($qualifier);
131136

132-
if (!is_null($model) && $model->hasColumn($column)) {
133-
$column = $model->column($column);
137+
$rules = [];
134138

135-
return implode('|', Rules::fromColumn($model->tableName(), $column));
139+
if (!is_null($model)) {
140+
if ($model->hasColumn($column)) {
141+
$modelColumn = $model->column($column);
142+
143+
$rules[$column] = Rules::fromColumn($model->tableName(), $modelColumn);
144+
145+
return $rules;
146+
} else {
147+
/** @var \Blueprint\Models\Model $column */
148+
foreach ($model->columns() as $column) {
149+
if ($column->dataType() === 'id') {
150+
continue;
151+
}
152+
153+
$rules[$column->name()] = Rules::fromColumn($model->tableName(), $column);
154+
}
155+
156+
return $rules;
157+
}
158+
} else {
159+
$rules[$column] = ['required'];
136160
}
137161

138-
return 'required';
162+
return $rules;
139163
}
140164

141165
private function registerModels(array $tree)

tests/Feature/Generator/Statements/FormRequestGeneratorTest.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,43 @@ public function output_writes_form_requests()
102102
$this->assertEquals(['created' => ['app/Http/Requests/PostIndexRequest.php', 'app/Http/Requests/PostStoreRequest.php', 'app/Http/Requests/OtherStoreRequest.php']], $this->subject->output($tree));
103103
}
104104

105+
/**
106+
* @test
107+
*/
108+
public function output_writes_form_requests_with_support_for_model_reference_in_validate_statement()
109+
{
110+
$this->files->expects('stub')
111+
->with('form-request.stub')
112+
->andReturn(file_get_contents('stubs/form-request.stub'));
113+
114+
$this->files->shouldReceive('exists')
115+
->twice()
116+
->with('app/Http/Requests')
117+
->andReturns(false, false);
118+
119+
$this->files->expects('makeDirectory')
120+
->twice()
121+
->with('app/Http/Requests', 0755, true)
122+
->andReturns(true, false);
123+
124+
$this->files->expects('exists')
125+
->with('app/Http/Requests/CertificateStoreRequest.php')
126+
->andReturnFalse();
127+
$this->files->expects('put')
128+
->with('app/Http/Requests/CertificateStoreRequest.php', $this->fixture('form-requests/certificate-store.php'));
129+
130+
$this->files->expects('exists')
131+
->with('app/Http/Requests/CertificateUpdateRequest.php')
132+
->andReturnFalse();
133+
$this->files->expects('put')
134+
->with('app/Http/Requests/CertificateUpdateRequest.php', $this->fixture('form-requests/certificate-update.php'));
135+
136+
$tokens = $this->blueprint->parse($this->fixture('definitions/model-reference-validate.bp'));
137+
$tree = $this->blueprint->analyze($tokens);
138+
139+
$this->assertEquals(['created' => ['app/Http/Requests/CertificateStoreRequest.php', 'app/Http/Requests/CertificateUpdateRequest.php']], $this->subject->output($tree));
140+
}
141+
105142
/**
106143
* @test
107144
*/
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
models:
2+
Certificate:
3+
name: string
4+
reference: string
5+
document: string
6+
expiry_date: date
7+
remarks: nullable text
8+
9+
controllers:
10+
Certificate:
11+
resource: api
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace App\Http\Requests;
4+
5+
use Illuminate\Foundation\Http\FormRequest;
6+
7+
class CertificateStoreRequest extends FormRequest
8+
{
9+
/**
10+
* Determine if the user is authorized to make this request.
11+
*
12+
* @return bool
13+
*/
14+
public function authorize()
15+
{
16+
return true;
17+
}
18+
19+
/**
20+
* Get the validation rules that apply to the request.
21+
*
22+
* @return array
23+
*/
24+
public function rules()
25+
{
26+
return [
27+
'name' => 'required|string',
28+
'reference' => 'required|string',
29+
'document' => 'required|string',
30+
'expiry_date' => 'required|date',
31+
'remarks' => 'required|string',
32+
];
33+
}
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace App\Http\Requests;
4+
5+
use Illuminate\Foundation\Http\FormRequest;
6+
7+
class CertificateUpdateRequest extends FormRequest
8+
{
9+
/**
10+
* Determine if the user is authorized to make this request.
11+
*
12+
* @return bool
13+
*/
14+
public function authorize()
15+
{
16+
return true;
17+
}
18+
19+
/**
20+
* Get the validation rules that apply to the request.
21+
*
22+
* @return array
23+
*/
24+
public function rules()
25+
{
26+
return [
27+
'name' => 'required|string',
28+
'reference' => 'required|string',
29+
'document' => 'required|string',
30+
'expiry_date' => 'required|date',
31+
'remarks' => 'required|string',
32+
];
33+
}
34+
}

0 commit comments

Comments
 (0)