/validation-rule-generator

Laravel 4 class to automatically generate validation rules based on table schema

Primary LanguagePHP

Validation Rule Generator

This package will automatically generate laravel validation rules, based on your schema. It can generate rules for:

  • All tables in the database
  • One (given) table
  • One (given) column from a (given) table

Pass in custom rules to override the automatically generated rules.

You can use the results from the ValidationRuleGenerator directly in a validator, or you can copy them from an Artisan command, and manually enter them into your models.

Installation

Install the package via Composer. Edit your composer.json file to require kalani/validation-rule-generator.

"require": {
    "laravel/framework": "4.0.*",
    "kalani/validation-rule-generator": "dev-master"
}

Next, update Composer from the terminal:

composer update

Finally, add the service provider to the providers array in app\config\app.php:

'Kalani\ValidationRuleGenerator\ValidationRuleGeneratorServiceProvider',

There is already an alias set up for ValidationRuleGenerator, but if you would like to refer to it by a short, memorable name in your app, you can add another alias as follows:

'Rules' => 'Kalani\ValidationRuleGenerator\Facades\ValidationRuleGenerator',

(We will use ValidationRuleGenerator and Rules interchangeably)

Usage

Artisan Command

php artisan make:validation will generate rules for a given table or model. These rules will be printed in a format that you could copy directly to another php file.

On the command line, you can run the rule generator as follows:

php artisan make:validation [--model="..."] [--table="..."] [--all]

One of these parameters is required:

--all               Output table information for all tables in the database
--table=table_name  Returns rules for the given table
--model=ModelName   Returns rules for the given model (with overrides)

If you pass in a --model parameter, the rule generator will generate rules for the model's table, and will then merge it with the model's $rules array. In cases of a conflict, the $rules array will take precedence.

Pass directly into validator

Call ValidationRuleGenerator::getRules($table|$model, $column, $rules, $id):

* `$table`  The name of the table (or model object) for which to get rules
* `$column` The name of the column
* `$rules`  Custom rules (override automatically generated rules)
* `$id`     Ignore unique rules for the given id

All of the parameters are optional. If you do not include any, the package will return an array of all rules in the database. If you include the $table, rules will be gathered from that table; $table and $column, rules will be gathered for the given table/column.

To validate a table:

$valid = Validator::make(Input::all(), Rules::getRules($tableName));

To validate a table, ignoring a given id:

$valid = Validator::make(Input::all(), Rules::getRules($tableName, null, null, $id));

Alternative Usage

To get all of the rules for a table, in your controller:

$rules = ValidationRuleGenerator::getTableRules($model->getTable(), array($custom_rules));
$validation = Validator::make(Input::all(), $rules);

You can also generate rules to ignore the current record id:

$rules = ValidationRuleGenerator::getUniqueRules($rules, $id);

If you'd like an array of all validation rules for all tables in your database:

$rules = ValidationRuleGenerator::getAllRules();

If you'd like validation rules for one column:

$rules = ValidationRuleGenerator::getColumnRules($table, $column);

Development

We are using mysql for database testing because sqlite does not include as many data types. In mysql, create a database, user, and password:

CREATE DATABASE test_lrg;
CREATE USER 'test_lrg'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Password1234!';
GRANT ALL ON test_lrg.* TO 'test_lrg'@'localhost';