برنامه نویسی

تسلط بر سفارش اجرای میان افزار در لاراول 12

Middleware Laravel یک مکانیسم مناسب برای فیلتر کردن درخواست های HTTP برای ورود به برنامه شما فراهم می کند. از تأیید اعتبار گرفته تا حفاظت از CSRF ، میان افزار به عنوان نگهبانان برنامه شما عمل می کند ، و اطمینان از درخواست ها قبل از رسیدن به منطق کسب و کار شما ، معیارهای خاص را رعایت می کند.

در Laravel 12 ، ترتیب اجرای Middleware می تواند برنامه شما را ایجاد یا خراب کند. این مقاله به اعماق زیر می رود:

  • سفارش اجرای نرم افزار
  • پارامترهای میانی
  • واسطه قابل خاتمه
  • مدیریت پشته جهانی میان افزار

بیایید به هنر میان افزار تسلط کنیم.


درک سفارش اجرای میان افزار

Middleware در Laravel به ترتیب ثبت شده اجرا می شود.

Route::get('/profile', function () {
    // Your route logic
})->middleware(['auth', 'verified', 'log-activity']);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در این مثال:

  1. auth وسط ظروف اول اجرا می شود.
  2. پس verifiedبشر
  3. و بالاخره log-activityبشر

مرتب سازی میان افزار در لاراول 12

بعضی اوقات ، شما به میانه وسایل نیاز دارید تا به ترتیب خاصی اجرا کنید – صرف نظر از نحوه اختصاص آنها به مسیرها. لاراول 12 معرفی می کند priority در bootstrap/app.php:

->withMiddleware(function (Middleware $middleware) {
    $middleware->priority([
        \App\Http\Middleware\ImportantFirstMiddleware::class,
        \App\Http\Middleware\MustRunSecondMiddleware::class,
        \App\Http\Middleware\ThirdInLineMiddleware::class,
        // Add more in the order you need
    ]);
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

چه زمانی از اولویت میانی استفاده کنید

از آن استفاده کنید وقتی:

  • یک میان افزار به دیگری بستگی دارد
  • شما می خواهید یک دستور اجرای مداوم جهانی
  • شما زنجیرهای میان افزار پیچیده ای با وابستگی دارید

مثال در دنیای واقعی: برنامه چند مستاجر

فرض کنید شما در حال ساخت یک برنامه چند مستاجر با میان افزار زیر هستید:

  • IdentifyTenant: تشخیص می دهد که درخواست متعلق به کدام مستاجر است
  • SetupTenantDatabase: پایگاه داده را سوئیچ می کند
  • ApplyTenantTheme: سبک های UI را سفارشی می کند

سفارش اعدام ضروری است:

->withMiddleware(function (Middleware $middleware) {
    $middleware->priority([
        \App\Http\Middleware\IdentifyTenant::class,
        \App\Http\Middleware\SetupTenantDatabase::class,
        \App\Http\Middleware\ApplyTenantTheme::class,
    ]);
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

چه اتفاقی می افتد بدون مرتب سازی مناسب؟

انتظار:

  • ویژگی های شکسته
  • ناسازگاری داده ها
  • شکافهای امنیتی
  • تخریب عملکرد

پارامترهای میانی

Laravel اجازه می دهد تا پارامترهای پویا دریافت کند.

مثال: بررسی اشتراک

class RequireSubscription
{
    public function handle(Request $request, Closure $next, string $level): Response
    {
        $user = $request->user();

        if (!$user || !$user->hasSubscription($level)) {
            return response()->json([
                'error' => 'This feature requires a ' . ucfirst($level) . ' subscription',
                'upgrade_url' => route('subscriptions.upgrade'),
            ], 403);
        }

        return $next($request);
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

استفاده

Route::get('/premium-content', fn () => 'Premium!')->middleware('subscription:premium');
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نحو مبتنی بر کلاس

Route::get('/analytics-dashboard', fn () => 'Analytics!')
    ->middleware(RequireSubscription::class.':business');
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پارامتر چندگانه

Route::get('/developer-tools', fn () => 'Dev tools')
    ->middleware('subscription:premium,business');
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


مثال در دنیای واقعی: فیلتر محتوای مبتنی بر سن

class ContentFilter
{
    public function handle(Request $request, Closure $next, int $minimumAge = 13, bool $skipWarning = false): Response
    {
        $user = $request->user();
        $userAge = $user?->age;

        if (!$userAge || $userAge < $minimumAge) {
            if ($skipWarning) {
                return redirect()->route('content.restricted');
            }
            session(['intended_url' => $request->fullUrl()]);
            return redirect()->route('content.warning', [
                'minimum_age' => $minimumAge,
            ]);
        }

        return $next($request);
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

استفاده

Route::get('/forums')->middleware('content.filter');
Route::get('/mature-content')->middleware('content.filter:18,true');
Route::get('/teen-content')->middleware('content.filter:16,false');
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


میانی واسطه قابل پایان: پس از قلاب های پاسخ

پس از ارسال پاسخ آیا باید منطق را اجرا کنید؟ از میان افزار خاتمه یافته استفاده کنید.

مثال: مشاهده صفحه نمایش

class TrackPageViews
{
    public function handle(Request $request, Closure $next): Response
    {
        return $next($request);
    }

    public function terminate(Request $request, Response $response): void
    {
        if ($request->ajax() || $response->getStatusCode() !== 200 || $request->method() !== 'GET') {
            return;
        }

        DB::table('page_views')->insert([
            'path' => $request->path(),
            'user_id' => $request->user()?->id,
            'user_agent' => $request->userAgent(),
            'ip_address' => $request->ip(),
            'viewed_at' => now(),
        ]);
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

به عنوان Singleton ثبت نام کنید

public function register(): void
{
    $this->app->singleton(\App\Http\Middleware\TrackPageViews::class);
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

موارد استفاده

  • ورود به سیستم
  • اعزام مشاغل
  • کارهای پاکسازی
  • نظارت بر عملکرد

مدیریت میان افزار جهانی لاراول

میان افزار جهانی را می توان در پیکربندی کرد bootstrap/app.phpبشر

تنظیم پشته جهانی سفارشی

->withMiddleware(function (Middleware $middleware) {
    $middleware->use([
        \Illuminate\Foundation\Http\Middleware\InvokeDeferredCallbacks::class,
        \Illuminate\Http\Middleware\TrustProxies::class,
        \Illuminate\Http\Middleware\HandleCors::class,
        \Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Http\Middleware\ValidatePostSize::class,
        \Illuminate\Foundation\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        // Add your custom global middleware here
    ]);
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

واسطه را جایگزین کنید

$middleware->web(replace: [
    \Illuminate\Session\Middleware\StartSession::class => \App\Http\Middleware\CustomSessionHandler::class,
]);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

واسطه را بردارید

$middleware->web(remove: [
    \Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::class,
]);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


بهترین روشها برای میان افزار

  • دستور اجرای واضح را حفظ کنید
  • میانه را به صورت یک منظوره نگه دارید
  • میانی نرم افزار مرتبط با گروه منطقی
  • بهینه سازی عملکرد
  • استثنائات را با لطف انجام دهید
  • زنجیرهای میانی را کاملاً آزمایش کنید

پایان

درک و کنترل اجرای میانی در Laravel 12 برای برنامه های SCEAL و Secure ضروری است. این که آیا شما در حال دستیابی به تأیید اعتبار ، محلی سازی یا منطق مستاجر هستید ، میانی نرم افزار هم انعطاف پذیری و قدرت را به شما می دهد.

تسلط priority() روش ، میانی واسطه پارامتری و وسط نرم افزار خاتمه یافته به شما در ساخت برنامه های قوی تر و قابل پیش بینی کمک می کند.

یک استراتژی میان افزار به خوبی طراحی شده منجر به کد پاک تر ، عملکرد بهتر و اشکالات کمتری می شود.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا