Skip to content

Commit 7ab28f2

Browse files
committed
Initial commit
0 parents  commit 7ab28f2

File tree

5 files changed

+251
-0
lines changed

5 files changed

+251
-0
lines changed

composer.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
{
3+
"name": "bekusc/laravel-auto-validation",
4+
"description": "",
5+
"authors": [
6+
{
7+
"name": "Rei Bengu",
8+
"email": "bengusc@gmail.com"
9+
}
10+
],
11+
"autoload": {
12+
"psr-4": {
13+
"Bekusc\\Validation\\": "src/"
14+
}
15+
}
16+
}

readme.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# Laravel Auto validation
2+
This package will allow you to remove all manual validations from your controllers.
3+
4+
## Installation
5+
Simply go to your project directory where the `composer.json` file is located and type:
6+
7+
```sh
8+
composer require bekusc/laravel-auto-validation
9+
```
10+
11+
Add the service provider to `config/app.php` under `providers`:
12+
13+
```php
14+
'providers' => [
15+
Bekusc\Validation\AutoValidationProvider::class,
16+
],
17+
```
18+
19+
Add the trait to your base controller:
20+
21+
```php
22+
use Bekusc\Validation\Traits\AutoValidation;
23+
24+
class Controller extends BaseController
25+
{
26+
use AutoValidation;
27+
}
28+
```
29+
30+
Publish config:
31+
32+
```
33+
php artisan vendor:publish --provider="Bekusc\Validation\AutoValidationProvider" --tag="config"
34+
```
35+
36+
Update config file with your validation rules in:
37+
38+
```
39+
config/validation.php
40+
```
41+
42+
## Example
43+
44+
`config/validation.php` file:
45+
46+
```php
47+
use Illuminate\Validation\Rule;
48+
49+
$rules = [
50+
'UserController' => [
51+
'register' => [
52+
'name' => 'required|max:255',
53+
'email' => ['required', 'email', 'max:255', Rule::unique('users')->where('status', 1)],
54+
'password' => 'required|min:6|confirmed',
55+
'gender' => 'required|in:male,female',
56+
'birthday' => 'required|date_format:Y-n-j',
57+
],
58+
'update' => function ($request) {
59+
return [
60+
'name' => 'required|max:255',
61+
'email' => 'required|email|max:255|unique:users,email,'.$request->user()->id,
62+
'gender' => 'required|in:male,female',
63+
'birthday' => 'required|date_format:Y-n-j',
64+
];
65+
}
66+
]
67+
];
68+
69+
return ['rules' => $rules];
70+
```
71+
72+
`UserController.php` file:
73+
74+
```php
75+
class UserController extends Controller
76+
{
77+
public function register(Request $request)
78+
{
79+
// the request will be validated automatically
80+
$request->user()->create($request->all());
81+
}
82+
83+
public function update(Request $request)
84+
{
85+
// the request will be validated automatically
86+
$request->user()->update($request->all());
87+
}
88+
}
89+
```

src/AutoValidationProvider.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace Bekusc\Validation;
4+
5+
use Illuminate\Support\ServiceProvider;
6+
7+
class AutoValidationProvider extends ServiceProvider
8+
{
9+
/**
10+
* Bootstrap the application events.
11+
*
12+
* @return void
13+
*/
14+
public function boot()
15+
{
16+
$this->publishes([
17+
__DIR__.'/config/validation.php' => config_path('validation.php'),
18+
]);
19+
}
20+
21+
/**
22+
* Register the service provider.
23+
*
24+
* @return void
25+
*/
26+
public function register()
27+
{
28+
//
29+
}
30+
}

src/Traits/AutoValidation.php

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<?php
2+
3+
namespace Bekusc\Validation\Traits;
4+
5+
use Closure;
6+
use Illuminate\Http\Request;
7+
8+
trait AutoValidation
9+
{
10+
/**
11+
* Execute an action on the controller.
12+
*
13+
* @param string $method
14+
* @param array $parameters
15+
* @return \Symfony\Component\HttpFoundation\Response
16+
*/
17+
public function callAction($method, $parameters)
18+
{
19+
$this->validateRequest(get_class($this), $method);
20+
21+
return $this->$method(...array_values($parameters));
22+
}
23+
24+
/**
25+
* Validate the request with specified rules in validation config.
26+
*
27+
* @param string $class
28+
* @param string $method
29+
* @return void
30+
*/
31+
protected function validateRequest(string $class, string $method)
32+
{
33+
$rules = $this->getValidationRules($class, $method);
34+
35+
if ($rules) {
36+
$request = request();
37+
38+
if ($rules instanceof Closure) {
39+
$rules = $rules($request);
40+
}
41+
42+
$this->validate($request, $rules);
43+
}
44+
}
45+
46+
/**
47+
* Get the rules to be used for request validation.
48+
*
49+
* @param string $class
50+
* @param string $method
51+
* @return array
52+
*/
53+
protected function getValidationRules(string $class, string $method)
54+
{
55+
$namespace = config("validation.namespace");
56+
57+
if (is_null($namespace)) {
58+
$namespace = 'App\Http\Controllers';
59+
}
60+
61+
$class_name = ltrim($class, $namespace);
62+
63+
return config("validation.rules.{$class_name}.{$method}");
64+
}
65+
}

src/config/validation.php

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
use Illuminate\Validation\Rule;
4+
5+
// example rules
6+
$rules = [
7+
'UserController' => [
8+
'register' => [
9+
'name' => 'required|max:255',
10+
'email' => ['required', 'email', 'max:255', Rule::unique('users')->where('status', 1)],
11+
'password' => 'required|min:6|confirmed',
12+
'gender' => 'required|in:male,female',
13+
'birthday' => 'required|date_format:Y-n-j',
14+
],
15+
'update' => function ($request) {
16+
return [
17+
'name' => 'required|max:255',
18+
'email' => 'required|email|max:255|unique:users,email,'.$request->user()->id,
19+
'gender' => 'required|in:male,female',
20+
'birthday' => 'required|date_format:Y-n-j',
21+
];
22+
}
23+
],
24+
'ResetPasswordController' => [
25+
'getResetMethods' => [
26+
'keyword' => 'required',
27+
],
28+
'sendToken' => [
29+
'method' => 'required|in:mail,phone_number',
30+
'keyword' => 'required',
31+
],
32+
'reset' => [
33+
'token' => 'required',
34+
'password' => 'required|min:6|confirmed',
35+
],
36+
],
37+
'Student\LessonsController' => [
38+
'create' => [
39+
'date' => 'required|date_format:Y-n-j',
40+
'time' => 'required|date_format:H:i',
41+
'duration' => 'required',
42+
'teacher_id' => 'required',
43+
'language_id' => 'required',
44+
],
45+
],
46+
];
47+
48+
return [
49+
'rules' => $rules,
50+
'namespace' => 'App\Http\Controllers',
51+
];

0 commit comments

Comments
 (0)