⚔️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'];
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posts');
}
};
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-ს
// და არომელი როუტი ასრულებს გარკვეულ ფუნქციონალს<?php
namespace App\Http\Controllers;
use App\Http\Requests\StorePostRequest;
use App\Http\Requests\UpdatePostRequest;
use App\Models\Post;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;
class PostController extends Controller
{
/**
* Return view with all Posts
*/
public function index(): View
{
$posts = Post::all();
return view('posts.index', ['posts' => $posts]);
}
/**
* Return view with single Post
*/
public function show(Post $post): View
{
return view('posts.show', ['post' => $post]);
}
/**
* Return view with Create Post form
*/
public function create(): View
{
// [!] მსგავსი როუტები ყოველთვის დაწერეთ Route::view()
// მეთოდის გამოყენებით. აქ ეგრე არ წერია მხოლოდ
// სასწავლო მიზნებიდან გამომდინარე
return view('posts.create');
}
/**
* Store Post in database
*/
public function store(StorePostRequest $request): RedirectResponse
{
Post::create($request->validated());
return redirect()->route('posts.index');
}
/**
* Return view with Edit Post form
*/
public function edit(Post $post): View
{
return view('posts.edit', ['post' => $post]);
}
/**
* Update Post in database
*/
public function update(UpdatePostRequest $request, Post $post): RedirectResponse
{
$post->update($request->validated());
return redirect()->route('posts.index');
}
/**
* Destroy Post in database
*/
public function destroy(Post $post): RedirectResponse
{
$post->delete();
return back();
}
}
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');
});
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\StorePostRequest;
use App\Http\Requests\UpdatePostRequest;
use App\Models\Post;
use Illuminate\Http\JsonResponse;
class PostController extends Controller
{
/**
* Retrieve All Posts from the database
*/
public function index(): JsonResponse
{
$posts = Post::all();
return response()->json(['posts'=>$posts], 200);
}
/**
* Retrieve Post from the database
*/
public function get(Post $post): JsonResponse
{
return response()->json(['post'=>$post], 200);
}
/**
* Store Post in the database
*/
public function store(StorePostRequest $request): JsonResponse
{
$post = Post::create($request->validated());
return response()->json($post, 201);
}
/**
* Update Post in the database
*/
public function update(UpdatePostRequest $request, Post $post): JsonResponse
{
$post->update($request->validated());
return response()->json(status: 204);
}
/**
* Destroy Post in the database
*/
public function destroy(Post $post): JsonResponse
{
$post->delete();
return response()->json(status: 204);
}
}
ეს სტატია ეხება მხოლოდ ქრუდ ოპერაციებს, ანუ ოეპრაციებს რომელიც უშუალოდ დაკავშირებულია მონაცემის ბაზაში ჩაწერის, წაკითხვის, განახლებისა და წაშლის ფუნქციონალთან. შესაბამისად სხვა სახის ლოგიკის იმპლემენტაციისას მაგალითად როგორიც არის ავტორიზაცია რეგისტრაცია და ლოგაუთი არ არის საჭირო, და პირიქით ცუდიც კია რო კონტროლერის მეთოდებს დავარქვათ ასეთი სახელები
// [!] არასწორი ვარიანტი
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(){}
}Last updated