اذهب إلى المحتوى
  • 0

Middleware in laravel 11 (auth and guest ) in breeze

السؤال

نشر

السلام عليكم
كما نعلم ان في لارافل الاصدار الحديث 11 تم تغيير ترتيب الملفات و تم حذف الملف kernel.php  الذي كان يتم فيه تسجيل المدل وير الذي يتم انشائه middleware
سؤالي هو كيف يمكنني التعديل على المدل وير (auth and guest ) التي يتم انشائها بشكل تلقائي مع الحزمه breeze
شكرا لكم

Recommended Posts

  • 0
نشر

في Laravel 11، تم تغيير بنية الملفات وتبسيط إدارة الـ middleware بحيث تم إزالة ملف Kernel.php، وقد تكون عملية إدارة الـ middleware مختلفة بعض الشيء. للعثور على الـ middleware الأساسية مثل auth وguest وتعديلها فهم لم ينشأوا بشكل تلقائي لذلك اذا كنت تريد التعديل عليهم يجب انشائهم يدويا 

php artisan make:middleware Authenticate
php artisan make:middleware RedirectIfAuthenticated

ثم يجب تسجيل الـ Middleware في ملف bootstrap/app.php لكي يتمكن Laravel من التعرف على الـ middleware الجديدة، يجب تسجيلها في ملف bootstrap/app.php. أضف التالي:

->withMiddleware(function (Middleware $middleware) {
	$middleware->alias([
		'auth' => \App\Http\Middleware\Authenticate::class,
		'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
	]);
})

ويمكنك التعديل علي الملفات التي تم إنشاؤه في مجلد app/Http/Middleware وقم بتعديلها. على سبيل المثال، لملف Authenticate.php:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class Authenticate
{
    public function handle($request, Closure $next)
    {
        if (Auth::guest()) {
            return redirect('/login');
        }

        return $next($request);
    }
}

بعد تسجيل الـ middleware، يمكنك استخدامها في المسارات الخاصة بك:

use Illuminate\Support\Facades\Route;

Route::middleware('auth')->group(function () {
    Route::get('/dashboard', function () {
        // محتوى الصفحة المحمية
    });
});

Route::middleware('guest')->group(function () {
    Route::get('/login', function () {
        // محتوى صفحة تسجيل الدخول
    });
});

 

  • 0
نشر

الطبقات الوسيطة التي ذكرتها (auth و geust) لا يتم إنشاؤها مع الحزمة Breeze فهي لا علاقة لها بالحزمة بشكل خاص وإنما تأتي مع إطار العمل نفسه و Breeze يستعملها عند تعريف المسارات الخاصة بعملية المصادقة والتسجيل وغيرها، كما هو الحال طبعاً مع Jetstream و Fortify ...

الطبقة الوسيطة guest عملها هو عدم السماح للمستخدم المصادق عليه بالوصول إلى مسارات الزوار أو بشكل أدق المسارات المطبق عليها هذه الطبقة وأذكر هنا مسار تسجيل الدخول و مسار تسجيل مستخدم جديد على سبيل المثال. (يعني لو مستخدم x سجل دخوله في التطبيق وحاول تعديل الرابط لزيارة صفحة تسجيل الدخول لن يتمكن من الوصول لها بل سيتم إعادة توجيهه إلى صفحة dashboard نفس الأمر بالنسبة لبقية المسارات المطبق عليها هذه الطبقة).

الطبقة الوسيطة auth تعمل عكس guest فهي تحمي مسارات المستخدم من الوصول من طرف الزوار، يعني لو زائر قام بتوجيه الطلب مباشرة إلى مسار dashboard على سبيل المثال من دون تسجيل الدخول هذه الطبقة ستُعيد توجيهه إلى مسار تسجيل الدخول ولن تسمح له بهذا الشيء.

في غالب الأحيان لا نحتاج التعديل على هذا السلوك و إنما إذا احتجنا إلى التعديل سيكون في الأغلب المسار الذي نريد توجيه المستخدم أو الزائر له، يعني لو الحالة هي أننا نريد توجيه المستخدم المصادق عليه إذا أراد الوصول إلى مسارات guest إلى مسار غير dashboard فيمكن ذلك ببساطة عبر التابع boot في الصنف AppServiceProvider بالشكل التالي:

use Illuminate\Auth\Middleware\RedirectIfAuthenticated;

// in boot method
RedirectIfAuthenticated::redirectUsing(fn($request) => route('my-space'));

و تُحدد المسار الذي تريد، وإن كان لديك منطق معقد لتحديد مسار التوجيه يُمكنك من خلال تغيير الدالة السهمية إلى دالة مجهولة عادية وتنفيذ المنطق ثم إرجاع المسار

use Illuminate\Auth\Middleware\RedirectIfAuthenticated;

// in boot method
RedirectIfAuthenticated::redirectUsing(function($request) {
  // do what you want

  return route('my-space');
});

بهذا الشكل إذا أراد مستخدم مصادق عليه الوصول إلى login مثلاً سيتم توجيهه إلى مسار my-space وليس الإفتراضي (dashboard)، بطبيعة الحال يجب تعريف هذا المسار وإلا سيعطيك خطأ أن المسار غير معرف. وهكذا نفس الأمر بخصوص الطبقة auth.

أيضاً يُمكن تحقيق ما تم ذكره أعلاه من خلال التعديل في الملف app.php الموجود في مجلد bootstrap من خلال التابع withMiddleware عبر إستعمال التوابع redirectTo و redirectUsersTo و redirectGuestsTo على حسب الحالة، في الأسفل بعض الأمثلة:

->withMiddleware(function (Middleware $middleware) {
  // $middleware->redirectTo('/', '/my-space');
  // $middleware->redirectUsersTo('/my-space');
  // $middleware->redirectGuestsTo('/');
  // $middleware->redirectUsersTo(fn ($request) => route('my-space'));
})

أما إن كان لابد من تعديل الصنف الإفتراضي وتخصيصه بالشكل الذي ترغب فعليك إنشاء صنف Middleware مثلاً:

pa make:middleware RedirectIfAuthenticated

ثم عمل override للصنف الإفتراضي وذلك من خلال تسجيلها بنفس الإسم:

->withMiddleware(function (Middleware $middleware) {
  $middleware->alias([
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
  ]);
})

بعد ذلك تستطيع التعديل على الصنف الذي أنشأته بالشكل الذي تريد،  كما يُمكنك عمل extends للصنف الإفتراضي وتخصيص الجزء الذي تريد فقط:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class RedirectIfAuthenticated extends \Illuminate\Auth\Middleware\RedirectIfAuthenticated
{
  protected function redirectTo(Request $request): ?string
  {
    return route('my-space');
  }
}

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...