Skip to content

Commit

Permalink
Generate "isUnique" rules with rule name and error field.
Browse files Browse the repository at this point in the history
  • Loading branch information
ADmad committed Jul 30, 2020
1 parent f6d3eb5 commit 1b31240
Show file tree
Hide file tree
Showing 10 changed files with 74 additions and 12 deletions.
28 changes: 25 additions & 3 deletions src/Command/ModelCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -848,7 +848,10 @@ public function getRules(Table $model, array $associations, Arguments $args): ar
$rules = [];
foreach ($fields as $fieldName) {
if (in_array($fieldName, $uniqueColumns, true)) {
$rules[$fieldName] = ['name' => 'isUnique'];
$rules[$fieldName] = [
'name' => 'isUnique',
'ruleName' => $this->ruleName($fieldName, 'unique'),
];
}
}
foreach ($schema->constraints() as $name) {
Expand All @@ -859,20 +862,39 @@ public function getRules(Table $model, array $associations, Arguments $args): ar
if (count($constraint['columns']) > 1) {
continue;
}
$rules[$constraint['columns'][0]] = ['name' => 'isUnique'];
$rules[$constraint['columns'][0]] = [
'name' => 'isUnique',
'ruleName' => $this->ruleName($constraint['columns'][0], 'unique'),
];
}

if (empty($associations['belongsTo'])) {
return $rules;
}

foreach ($associations['belongsTo'] as $assoc) {
$rules[$assoc['foreignKey']] = ['name' => 'existsIn', 'extra' => $assoc['alias']];
$rules[$assoc['foreignKey']] = [
'name' => 'existsIn',
'extra' => $assoc['alias'],
'ruleName' => $this->ruleName($assoc['foreignKey'], 'unique'),
];
}

return $rules;
}

/**
* Generate application rule name.
*
* @param string $field Field name.
* @param string $prefix Rule name prefix.
* @return string
*/
protected function ruleName(string $field, string $prefix = ''): string
{
return $prefix . Inflector::classify($field);
}

/**
* Get behaviors
*
Expand Down
6 changes: 5 additions & 1 deletion templates/bake/Model/table.twig
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,11 @@ class {{ name }}Table extends Table
public function buildRules(RulesChecker $rules): RulesChecker
{
{% for field, rule in rulesChecker %}
$rules->add($rules->{{ rule.name }}(['{{ field }}']{{ (rule.extra is defined and rule.extra ? (", '#{rule.extra}'") : '')|raw }}));
$rules->add(
$rules->{{ rule.name }}(['{{ field }}']{{ (rule.extra is defined and rule.extra ? (", '#{rule.extra}'") : '')|raw }}),
'{{ rule.ruleName }}',
['errorField' => '{{ field }}']
);
{% endfor %}
return $rules;
Expand Down
4 changes: 4 additions & 0 deletions tests/TestCase/Command/ModelCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1166,14 +1166,17 @@ public function testGetRules()
$expected = [
'username' => [
'name' => 'isUnique',
'ruleName' => 'uniqueUsername',
],
'country_id' => [
'name' => 'existsIn',
'extra' => 'Countries',
'ruleName' => 'uniqueCountryId',
],
'site_id' => [
'name' => 'existsIn',
'extra' => 'Sites',
'ruleName' => 'uniqueSiteId',
],
];
$this->assertEquals($expected, $result);
Expand Down Expand Up @@ -1205,6 +1208,7 @@ public function testGetRulesUniqueKeys()
$expected = [
'title' => [
'name' => 'isUnique',
'ruleName' => 'uniqueTitle',
],
];
$this->assertEquals($expected, $result);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,16 @@ public function initialize(array $config): void
*/
public function buildRules(RulesChecker $rules): RulesChecker
{
$rules->add($rules->existsIn(['category_id'], 'Categories'));
$rules->add($rules->existsIn(['product_id'], 'Products'));
$rules->add(
$rules->existsIn(['category_id'], 'Categories'),
'uniqueCategoryId',
['errorField' => 'category_id']
);
$rules->add(
$rules->existsIn(['product_id'], 'Products'),
'uniqueProductId',
['errorField' => 'product_id']
);

return $rules;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,11 @@ public function validationDefault(Validator $validator): Validator
*/
public function buildRules(RulesChecker $rules): RulesChecker
{
$rules->add($rules->existsIn(['product_id'], 'Products'));
$rules->add(
$rules->existsIn(['product_id'], 'Products'),
'uniqueProductId',
['errorField' => 'product_id']
);

return $rules;
}
Expand Down
6 changes: 5 additions & 1 deletion tests/comparisons/Model/testBakeEntityWithPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,11 @@ public function initialize(array $config): void
*/
public function buildRules(RulesChecker $rules): RulesChecker
{
$rules->add($rules->isUnique(['username']));
$rules->add(
$rules->isUnique(['username']),
'uniqueUsername',
['errorField' => 'username']
);

return $rules;
}
Expand Down
6 changes: 5 additions & 1 deletion tests/comparisons/Model/testBakeTableConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,11 @@ public function validationDefault(Validator $validator): Validator
*/
public function buildRules(RulesChecker $rules): RulesChecker
{
$rules->add($rules->existsIn(['user_id'], 'Users'));
$rules->add(
$rules->existsIn(['user_id'], 'Users'),
'uniqueUserId',
['errorField' => 'user_id']
);

return $rules;
}
Expand Down
6 changes: 5 additions & 1 deletion tests/comparisons/Model/testBakeTableWithCounterCache.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,11 @@ public function initialize(array $config): void
*/
public function buildRules(RulesChecker $rules): RulesChecker
{
$rules->add($rules->existsIn(['todo_item_id'], 'TodoItems'));
$rules->add(
$rules->existsIn(['todo_item_id'], 'TodoItems'),
'uniqueTodoItemId',
['errorField' => 'todo_item_id']
);

return $rules;
}
Expand Down
6 changes: 5 additions & 1 deletion tests/comparisons/Model/testBakeTableWithPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,11 @@ public function initialize(array $config): void
*/
public function buildRules(RulesChecker $rules): RulesChecker
{
$rules->add($rules->isUnique(['username']));
$rules->add(
$rules->isUnique(['username']),
'uniqueUsername',
['errorField' => 'username']
);

return $rules;
}
Expand Down
6 changes: 5 additions & 1 deletion tests/comparisons/Model/testBakeWithRulesUnique.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,11 @@ public function validationDefault(Validator $validator): Validator
*/
public function buildRules(RulesChecker $rules): RulesChecker
{
$rules->add($rules->isUnique(['username']));
$rules->add(
$rules->isUnique(['username']),
'uniqueUsername',
['errorField' => 'username']
);

return $rules;
}
Expand Down

0 comments on commit 1b31240

Please sign in to comment.