في السنوات الأخيرة إنتشر بشكل كبير مفهوم Api Versioning، والفكرة الرئيسية منه هي عدم حذف Api القديمة عندما نحتاج لإنشاء نسخة جديدة من API، حيث يتم إضافة الإصدار إلى الرابط، وبإتباع هذه الفكرة سيكون لدينا على سبيل المثال الروابط التالية :
http://www.test.test/api/v1/brands http://www.test.test/api/v2/brands
لاحظ أن الفرق بين الرابطين هو “V1” و “V2”، فهي مرتبطة بالإصدار الذي نستخدمة، مثلا بعض التطبيقات، مواقع front end القديمة، سوف تستخدم الإصدار الأول V1، وبينما الإصدارات المحدثة من التطبيقات ومواقع front end سوف تستخدم الإصدار v2.
حتى يكون العمل منظم من المفضل أن يتم تطبيق Versioning على المجلدات، فبداخل المجلد Controllers/Api يفضل إنشاء V1 للـ controllers التي تستخدم الإصدار الأول، و مجلد V2 للـ controllers التي تستخدم الإصدار الثاني، كذلك يمكن تطبيق هذه الطريقة على Resources.
app/Http/Controllers/Api/V1
app/Http/Controllers/Api/V2
وللقيام بذلك
إنشاء مجلد V1 بداخل مجلد API بداخل مجلد Controllers
/app
/controllers
/Api
/v1
/BrandController.php
تعديل namespace للـ Controllers التي تم نقلها إلى المجلد V1
namespace App\Http\Controllers\API\V1; class BrandController extends Controller {
تعديل nameSpace للـ BrandController في ملف routes/api.php
use App\Http\Controllers\API\V1\BrandController; Route::apiResource('brands',BrandController::class);
تعديل prfix من api إلى api/v1 في ملف routeServiceProvider.php
Route::prefix('api/v1') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php'));
الأن لو قمنا بزيارة الرابط بإستخدام v1 فإننا سوف نحصل على النتائج.
إنشاء مجلد V2 للـ Controllers
تعديل namespace للـ controllers التي توجد بداخل المجلد V2
<?php
namespace App\Http\Controllers\API\V2;
class BrandController extends Controller
{
إنشاء route prefix في الكلاس routeServiceProvider.php بداخل الدالة boot
Route::prefix('api/v2')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api_V2.php'));
كما نلاحظ أنه ملف route إسمة api_v2.php وهو غير موجود، حيث نحتاج لإنشاؤه في المسار routes/api_v2.php، من أجل إستخدام namespace للـ controllers التي توجد بداخل المجلد V2 وذلك لأن controllers namespace التي توجد بداخل الملف api.php تؤشر على الـ controllers التي توجد بداخل المجلد V1
//routes/api_v2.php <?php use App\Http\Controllers\API\V2\BrandController; Route::apiResource('brands',BrandController::class);
الأن لو قمنا بزيارة الرابط بـ V2
/app /controllers /Api /v3 /BrandController.php
Route::prefix('api/v3') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api_V3.php'));
//routes/api_v3.php
<?php
use App\Http\Controllers\API\V3\BrandController;
Route::apiResource('brands',BrandController::class);
http://www.test.test/api/v3/brands
زائر
السلام عليكم يعطيك العافية م. إيثار شروف اولا أتقدم بالشكر الخالص لك لما تقدمه من مقالات مفيدة لمجتمعنا العربي ،والتى لطالما قمت بالرجوع الى تلك المقالات للاستفادة منها . كان هناك طلب لتطوير موقعك \"etharshrouf.com\" ، وهو يتمثل في إضافة تواريخ للمقالات بالاضافة الي فلتر بحث لترتيب المقالات حسب الاحدث والاقدم ،مع وبدون اختيار القسم. خالص تحياتي