⚔️CRUD ოპერაციები

რა არის CRUD ოპერაციები

CRUD არის აკრონიმი, და ის გულისხმობს 4 ოპერაციას, რომლებიც აუცილებელია ყოველი აპლიკაციისთვის რომელიც მონაცემთა ბაზებთან ან რაიმე სახის storage-თან მუშაობს. ეს ოთხი ოპერაცია არის შემდეგი: create, read, update, delete. ამ სტატიაში განხილულია ლარაველის კონვენციები CRUD ოპერაციებთან დაკავშირებით. კონკრეტულად თუ როგორი ფორმატით უნდა გვეწეროს შესაბამისი როუტები და რა მეთოდები უნდა გააჩნდეთ შესაბამის კონტროლერებს. მოდი შევქმნათ ძალიან მარტივი აპლიკაცია, რომელსაც შეეძლება პოსტების ბაზიდან წამოღება, ჩაწერა, განახლება, და წაშლა. ჩვენ გვაქვს Post მოდელი და შესაბამისი მიგრაცია. Post-ს გააჩნია მხოლოდ 2 პარამეტრი 'title' და 'body'. რომლის შესაბამისი მიგრაციაც და მოდელიც შემდეგნაირად გამოიყრება:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;
    
    protected $guarded = ['id'];
}

Webის როუტებთან დაკავშირებული კონვენციები

როუტები და კონტროლერის მეთოდები სტანდარტულ აპლიკაციასში, სადაც ვაბრუნებთ გარკვეულ View ებს და ასევე აღვწერთ ბაზასთან მუშაობის ლოგიკას.

ამ შემთხვევაში როუტების აღსაწერად ჩვენ ვმუშაობთ web.php ფაილში, და კონტროლერებს ვქმით app/Http/Controllers/ - დირექტორიაში

<?php

use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group that
| contains the "web" middleware group. Now create something great!
|
*/

Route::group(['controller' => PostController::class], function () {
    Route::get('/posts', 'index')->name('posts.index');
    Route::get('/posts/{post}', 'show')->name('posts.show');
    Route::get('/posts/create', 'create')->name('posts.create');
    Route::post('/posts', 'store')->name('posts.store');
    Route::get('/posts/{post}/edit', 'edit')->name('posts.edit');
    Route::put('/posts/{post}', 'update')->name('posts.update');
    Route::delete('/posts/{post}', 'destroy')->name('posts.destroy');
});

// PostController-ში აღწერილია თუ რომელი როუტი აბრუნებს View-ს 
// და არომელი როუტი ასრულებს გარკვეულ ფუნქციონალს

ხშირი არის შემთხვევა როდესაც ხელით ვქმნით ადმინპანელს. შესაბამისი კონტროლერები სასურველია ჩავყაროთ Admin დირექტორიაში. ამისათვის კონტროლერის შექმნისას შეგვიძლია შემდეგი ბრძანება გმაოვიყენოთ php artisan make:controller Admin/FooController ხოლო იმპორტის კომფლიქტის თავიდან ასარიდებლად კი დავაიმპორტოთ ალიასით

<?php

use App\Http\Controllers\Admin\PostController as AdminPostController;
use App\Http\Controllers\PostController;

Route::get('/posts/create', [AdminPostController::class, 'create'])->name('posts.create');
Route::get('/posts/something', [PostController::class, 'someMethod'])->name('posts.someMethod');

API-ის როუტებთან დაკავშირებული კონვენციები

წინა მაგალითისაგან განსხვავებით როდესაც ჩვენ გვინდა მხოლოდ API-ს შექმნა, ამჟამად უკვე აღარ გვიწევს View ების დაბრუნება და ჩვენს API-ის ექნება შემდეგი სახე:

ამ შემთხვევაში როუტების აღსაწერად ჩვენ ვმუშაობთ api.php ფაილში, და კონტროლერებს ვქმით app/Http/Controllers/Api - დირექტორიაში

<?php

use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::group(['controller' => ProductController::class], function () {
	Route::get('/posts', 'index')->name('posts.index');
	Route::get('/posts/{post}', 'get')->name('posts.get');
	Route::post('/posts', 'store')->name('posts.store');
	Route::put('/posts/{post}', 'update')->name('posts.update');
	Route::delete('/posts/{post}', 'destroy')->name('posts.destroy');
});


იმისათვის რომ ჩვენი კონტროლერი თავიდანვე შესაბამის დირექტორიაში შეიქმნას შეგვიძლია მისი შექმნისას არტისანის ბრძანებაშივე მივუთითოთ სასურველი დირექტორია. (ჩვენს შემთხვევაში API)

php artisan make:controller Api/FooController

ეს სტატია ეხება მხოლოდ ქრუდ ოპერაციებს, ანუ ოეპრაციებს რომელიც უშუალოდ დაკავშირებულია მონაცემის ბაზაში ჩაწერის, წაკითხვის, განახლებისა და წაშლის ფუნქციონალთან. შესაბამისად სხვა სახის ლოგიკის იმპლემენტაციისას მაგალითად როგორიც არის ავტორიზაცია რეგისტრაცია და ლოგაუთი არ არის საჭირო, და პირიქით ცუდიც კია რო კონტროლერის მეთოდებს დავარქვათ ასეთი სახელები

// [!] არასწორი ვარიანტი
class AuthController extends Controller
{
	public function index(){}
	public function store(){}
	public function destroy(){}
}

// [!] სწორი ვარიანტი 
class AuthController extends Controller
{
	public function login(){}
	public function register(){}
	public function logout(){}
}

სტატუს კოდები

  • 200 - წარმატებით შესრულდა და response-ში რაიმე მონაცემებს ვაბრუნებთ

  • 201 - წარმატებით შეიქმნა ჩანაწერი, და ვაბრუნებთ შესაბამის მონაცემებს

  • 204 - ოპერაცია წარმატებით განხორციელდა, და არაფერს ვაბრუნებთ

  • 401 - არაავტენტიფიცირებული (არა ხარ დალოგინებული)

  • 403 - Forbidden არა ხარ ავტორიზირებული (ხარ ავტენტიფიცირებული მაგრამ არ გაქვს უფლება)

  • 404 - მოცემული ენდფოინთი არ არსებობს, ან მიუწვდომელია

  • 422 - მოგვეწოდა არავალიდური მონაცემები (Form Request ავტომატურად აბრუნებს ამ სტატუს კოდს როდესაც ვალიდაციას ვერ გაივლის)

Last updated