> For the complete documentation index, see [llms.txt](https://redberry.gitbook.io/resources/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://redberry.gitbook.io/resources/kodisa-da-proektis-shepasebis-kriteriumebi/laravel-kodis-standartebi/form-request-validations.md).

# Form Request - Validations

ვალიდაციები უნდა იყოს გაკეთებული [Form Request](https://laravel.com/docs/9.x/validation#form-request-validation)-ებით.

## Conventions

1. Form Request-ის სახელი უნდა იყოს PascalCase ქეისით. :white\_check\_mark:
2. Crud ოპერაციების შემთხვევაში უნდა იცავდნნე შემდეგ ფორმატს ActionModelRequest. :white\_check\_mark:მაგალითები:
   * StorePostRequest
   * UpdatePostRequest
   * DestroyPostRequest
3. არა Crud ოპერაციების შემთხვევაშიც უნდა იცავდნენ მსგავს ფორმატს, სახელი უნდა იყოს ინტუიციური და აღწერდეს რა მეთოდისთვის არის გამოყენებული.:white\_check\_mark:
4. ფორმ რექვესთის ცვლადს უნდა ერქვას $request:white\_check\_mark:
5. კონტროლერის ერთი მეთოდი მხოლოდ 1 ცალ FormRequest-ს უნდა იყენებდეს.:white\_check\_mark:
6. უნდა ჰქონდეთ Request სუფიქსი:white\_check\_mark:
7. თუ კონკრეტულ მოდელზე ბევრი FormRequest იყრის თავს დავაჯგუფოთ ისინი შესაბამისი მოდელი სახელის მქონე subDirectory-ში.&#x20;

{% hint style="info" %}
`php artisan make:request Model/StoreModelRequest` აქ წინ "`Model/`"-ის  დამატებით მარტივად დავაჯგუფებთ თავიდანვე ჩვენს ფორმ რექვესთებს.\
\
მაგალითად:\
`php artisan make:request Post/StorePostRequest`\
`php artisan make:request Post/UpdatePostRequest`\
`php artisan make:request Comment/StoreCommentRequest`\
`php artisan make:request Comment/UpdateCommentRequest`\
\
![](https://392590438-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrgmjFj4NNSsoaQmAk09Z%2Fuploads%2FqIrFVIEjfypS1tSr0Y2l%2Fimage.png?alt=media\&token=0715e5d8-923c-4975-8c77-eb440756da99)<br>
{% endhint %}

## კომპლექსური შემთხვევები

არის შემთხვევები, როდესაც ერთი მოთხოვნისას საჭიროა შეიქმნას და ბაზაში ჩაიწეროს რამოდენიმე მოდელის შესაბამისი მონაცემები. აქ პრობლემური ხდება ის რომ ამ მოდელებს საერთო სახელის  მქონე თვისებები (properties) გააჩნდეთ.\
\
მაგალითად გვაქვს ორი ცხრილი, ფილმებისა და რეჟისორების და ორივეს გააჩნიათ შემდეგი საერთო თვისებები name, description.  როგორ უნდა მოვიქცეთ ამ დროს რომ მივიღოთ სუფთა კოდი<br>

### :white\_check\_mark: GOOD - კარგი მიდგომა

{% tabs %}
{% tab title="StoreDirectorAndMovieRequest" %}

```php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreDirectorAndMovieRequest extends FormRequest
{
	public function rules()
	{
		return [
			'director.name' => 'required',
			'director.surname' => 'required',
			'director.description' => 'required',
			'movie.name' => 'required',
			'movie.description' => 'required',
			'movie.year' => 'required',
		];
	}
}
```

{% endtab %}

{% tab title="DirectorController" %}

```php
<?php

namespace App\Http\Controllers;

use App\Http\Requests\StoreDirectorRequest;
use App\Models\Director;
use App\Models\Movie;
use Illuminate\View\View;

class DirectorController extends Controller
{
	/**
	 * Return view with all Posts
	 */
	public function storeDirectorAndMovie(StoreDirectorRequest $request): View
	{
		$director = Director::create($request->director);
		$movie = Movie::create($request->movie);

		return view('posts-index', [
			'director' => $director,
			'movie'    => $movie,
		]);
	}
}
```

{% endtab %}
{% endtabs %}

### :warning:  BAD - ცუდი მიდგომა

აქ უკვე შეიმჩნევა კოდის მოცულობაში განსხვავება. რეალურ პროექებში საგრძნობლად მეტი კოდი იზოგება ვინაიდან თითოეულ მოდელს არა 3 არამედ 10-15 და გაცილებით მეტი თვისებაც შეიძლება ჰქონდეს

{% tabs %}
{% tab title="StoreDirectorAndMovieRequest" %}

```php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreDirectorAndMovieRequest extends FormRequest
{
	public function rules()
	{
		return [
			'director_name' => 'required',
			'director_surname' => 'required',
			'director_description' => 'required',
			'movie_name' => 'required',
			'movie_description' => 'required',
			'movie_year' => 'required',
		];
	}
}
```

{% endtab %}

{% tab title="DirectorController" %}

```php
<?php

namespace App\Http\Controllers;

use App\Http\Requests\StoreDirectorRequest;
use App\Models\Director;
use App\Models\Movie;
use Illuminate\View\View;

class DirectorController extends Controller
{
	/**
	 * Return view with all Posts
	 */
	public function storeDirectorAndMovie(StoreDirectorRequest $request): View
	{
		$director = Director::create([
			'name'        => $request->director_name,
			'description' => $request->director_description,
			'surname'     => $request->director_surname,
		]);
		$movie = Movie::create([
			'name'        => $request->movie_name,
			'description' => $request->movie_description,
			'year'        => $request->movie_year,
		]);

		return view('posts-index', [
			'director' => $director,
			'movie'    => $movie,
		]);
	}
}

```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
სამწუხაროდ, ამის შესაძლებლობა გვაქვს მხოლოდ როდესაც ჯავასკრიპტით იგზავნება მოცემულ ენდფოინთზე მონაცემები, და მითითებულია content-type application/json ჰედერი.  ამიტომ როდესაც SPA აპლიკაცია გაქვთ (Single Page Application) და აქტიურად იყენებთ ჯავასკრიპტს მაშინ შეგეძლებათ ასეთი სუფთა კოდის დაწერა.\
\
როდესაც სტანდარტულად Form-ის Submit-შემდეგ ხდება მონაცემთა გამოგზავნა კარგი მიდგომით რაც გვიწერია ეგ აღარ გამოგვადგება. რადგან რექვესთის body ავტომატურად არ კონვერტირდება application/json ფორმატით.<br>
{% endhint %}
