GET YOUR ENVIRONMENT READY TO WELCOME LARAVEL V12
Feb 10, 2025 Copy Link
اهلاً بيكوا من جديد في مقالة مهمة لكل اللي عاوز يعمل upgrade ل لارفيل 12 🤩
طبعاً في البداية كدا Taylor Otwell وضح في Laracon EU إن لارفيل 12 هيصحلها release في 24 فبراير, و قال إنه مش هيكون فيه breaking change أو تغيير كبير ف ال skeleton زي ما حصل في لارفيل 11. لما سمعت الخبر دا اتحمَّست لان دا هيشجعني اعمل upgrade للبلوج عشان تكون جاهزة في استقبال الفيرجن الجديد 👨💻
و فعلاً عملت ال upgrade دا و قررت أنشر مقالة عشان اقول علي الخطوات اللي عملتها في ال upgrade 🤝
أول حاجة عملتها هي إني نقلت كل الحاجات اللي مش هتتاثر من فيرجن للتاني زي ال Actions و ال Repositories و ال Contracts و ممكن تنقل ال Requests و ال Mails و ال Jobs لان التغيير فيهم بسيط جداً 😎
نيجي بقا للجزء الخاص بال routes و ال middlewares لان دول فيهم شغل كتير, دلوقتي تعالوا نفتح ال bootstrap/app.php لان دا اللي هنعرّف فيه مكان ال routes بتاعتنا
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: [
__DIR__ . '/../routes/web.php',
__DIR__ . '/../routes/dashboard.php',
],
api: __DIR__ . '/../routes/api.php'
)
->withMiddleware(function (Middleware $middleware) {
//
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
لو حذفت ميثود ال withMiddleware هيضرب اكسبشن معاك.
زي ما واضح في الكود دا, إنك ممكن تمرر array ب مكان ال route files و لو عندك فايل واحد ممكن تكتب string عادي, و هكذا بالنسبة لل API route files, طبعاً دا هيخلي ال route file بتاعك شكله كدا مثلاً 🙄
Route::middleware('auth')
->prefix('cats')
->name('cats.')
->controller(CatController::class)
->group(function () {
//
});
الطريقة اللي جاية دي هي اللي استخدمتها و مش هتتعبك لانك هتنقل الكود اللي في ال RouteServiceProvider و ال route file مش هيكون زي اللي فات
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
api: __DIR__ . '/../routes/api.php',
then: function () {
Route::middleware(['web', 'throttle:preventDDOS'])
->prefix('admin')
->name('admin.')
->group(base_path('routes/dashboard.php'));
Route::middleware(['web', 'throttle:preventDDOS'])
->name('blog.')
->group(base_path('routes/web.php'));
}
)
->withMiddleware(function (Middleware $middleware) {
//
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
في الشكل دا مررنا closure لل then argument, و هتلاحظ إني مستحدم throttle و عشان تعمل register لل throttle في الفيرجن الجديد هتروح لل AppServiceProvider و تكتب الكود دا
use Illuminate\Http\Request;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
RateLimiter::for('preventDDOS', function (Request $request) {
return auth()->check() ?
Limit::none() : Limit::perMinute(60)->by($request->ip());
});
}
}
دي مقالة اتكلمت فيها عن ال RateLimiter بإستفاضة.
و بكدا اكون خلصت كل حاجة تخص ال routes. تعالوا بقا نشوف ال middlewares هنلاقي إن مش موجود اي middleware, زي مثلاً اللي بيعمل redirect لليوزر لو كان auth أو guest و دا لان تم إستبدالهم بميثودز...ايواا زي ما قرأت كدا, تم إستبدالهم كلهم ب ميثودز! 🤯
تعالوا نشوف بعض الميثودز دي و إزاي هنستخدمها
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
...
)
->withMiddleware(function (Middleware $middleware) {
$middleware
->redirectGuestsTo('/admin/login')
->redirectUsersTo('/admin');
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
ميثود redirectGuestsTo هي تعتبر بديل لل Authenticate middleware و ميثود redirectUsersTo هي تعتبر بديل لل RedirectIfAuthenticate middleware و زي ما انت شايف بتمرر المسار اللي عاوزه أو ممكن تمرر closure كمان 😉
هتلاقي هنا طرق استخدام ال methods دي.
أما عن جزء الإكسبشنز, لو إنت عايز تعمل overwrite علي الإكسبشنز الخاصة ب لارفيل زي ال NOT FOUND إكسبشن, هتكتب الكود اللي جاي دا
use Illuminate\Foundation\Application;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
...
)
->withMiddleware(function (Middleware $middleware) {
...
})
->withExceptions(function (Exceptions $exceptions) {
$exceptions->respond(function (Response $response) {
return CustomExceptionClass::render($response);
});
})->create();
طبعاً ال render ميثود المفروض هترجع ال custom view بتاعك زي كدا 💆♂️
namespace App\Exceptions;
class CustomExceptionClass
{
/*
* Render the exception into an HTTP response.
*/
public static function render($response)
{
$statusCode = $response->getStatusCode();
if ($statusCode >= 200 && $statusCode < 400) {
return $response;
}
return response()->view('your-custom-view', [
'statusCode' => $statusCode,
'message' => $response::$statusTexts[$statusCode],
], $response->getStatusCode());
}
}
حابب اوضحلك إن لارفيل مش هتروح للكلاس دا في حالة الإكسبشنز بس, هتروح في حالة ال redirect request كمان (مثلاً) عشان كدا ضفت الكوندشن اللي في الاول دا.
دا مثال من لارفيل بيوضح إزاي تعمل كدا بشكل مُفصل اكتر.
كدا تكون عملت upgrade بشكل صحيح ان شاء الله و مستعد لإستقبال لارفيل 12 ⌛
و دلوقتي جه وقت الجملة الشهيرة بتاعتنا...و بكدا أكون خلصت و أتمني تكون إستفدت ✔