Middleware - LARAVEL

Middleware - LARAVEL

Middleware

 

Giriş

Middleware, uygulamanıza giren HTTP isteklerini filtrelemek için uygun bir mekanizma sağlar. Örneğin Laravel, uygulamanızın kullanıcısının kimlik doğrulamasını doğrulayan bir ara katmanı içeriyor. Kullanıcı kimliği doğrulanmazsa, katman kullanıcıyı oturum açma ekranına yönlendirir. Bununla birlikte, kullanıcı kimliği doğrulanırsa, ara katman, isteğin uygulamanın ilerleyişine izin vermesine izin verir.

Tabii ki, kimlik doğrulama dışında çeşitli görevleri yerine getirmek için ek katman yazılımı yazılabilir. Bir CORS katmanı, uygulamanızdan ayrılan tüm yanıtlara uygun başlık eklemenin sorumluluğunu üstlenebilir. Bir günlük ara katmanı, gelen tüm istekleri uygulamanıza günlüğe yazabilir.

Kimlik doğrulama ve CSRF koruması için katman da dahil olmak üzere Laravel çerçevesinde bulunan birkaç ara katman vardır. Tüm bu ara katmanlar dizinde bulunur .app/Http/Middleware

 

Middleware tanımlama

Yeni bir katman yaratmak için Artisan komutunu kullanın:make:middleware

php artisan make:middleware CheckAge

Bu komut dizininize yeni bir CheckAgesınıf yerleştirecektir. Bu katman yazılımında, sağlanan kaynak 200'den büyükse, yalnızca rotaya erişim izni veriyoruz. Aksi takdirde, kullanıcıları URI'ya yönlendiriyoruz .app/Http/Middlewareagehome

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->age <= 200) {
            return redirect('home');
        }

        return $next($request);
    }

}

Gördüğünüz gibi , verilen agedeğer eşit veya daha küçükse 200, katman yazılımı istemciye bir HTTP yönlendirme döndürür; Aksi takdirde, talep başvurunun daha da ileri götürülür. Talebin uygulamaya derinlemesine geçmesi için (ara katmanın "geçişi" yapılmasına izin verilir), $nextgeri aramayı yalnızca ile çağırın $request.

Katman yazılımlarını, HTTP isteklerinin uygulamanıza yapmadan önce geçirmesi gereken bir dizi "katman" olarak tasarlamak en iyisidir. Her katman talebi inceleyebilir ve hatta tamamen reddedebilir.

Middleware öncesi ve sonrası

Bir ara katman, bir talebin öncesinde veya sonrasında çalışıp gerekmeyeceğine bağlı olarak ara katmanın kendisine bağlıdır. Örneğin, aşağıdaki ara katman , istek uygulama tarafından işlenmeden önce bazı görevleri yerine getirir:

<?php

namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // Perform action

        return $next($request);
    }
}

Bununla birlikte, bu ara katman , isteği uygulama tarafından işlendikten sonra görevini yerine getirecektir:

<?php

namespace App\Http\Middleware;

use Closure;

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // Perform action

        return $response;
    }
}

 

Middleware'in Kaydedilmesi

 

Global Middleware

Bir ara katman uygulamanıza her HTTP isteği sırasında çalışmasını istiyorsanız, basitçe katman sınıfını listelemek $middlewareiçin mülkiyet sınıfına.app/Http/Kernel.php

 

Middleware'i Yollara Atamak

Belirli güzergahlara orta katman atamak isterseniz, öncelikle orta katman dosyasına dosyanızda bir anahtar atamanız gerekir . Varsayılan olarak, bu sınıfın özelliği Laravel'e dahil edilen katman için girdiler içerir. Kendi listenizi eklemek için, onu bu listeye ekleyin ve seçiminize bir anahtar koyun. Örneğin:app/Http/Kernel.php$routeMiddleware

// Within App\Http\Kernel Class...

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

Orta katman HTTP middlewareçekirdeğinde tanımlandıktan sonra, yolu bir ara katman atamak için yöntemi kullanabilirsiniz:

Route::get('admin/profile', function () {
    //
})->middleware('auth');

Rotaya birden çok katman da atayabilirsiniz:

Route::get('/', function () {
    //
})->middleware('first', 'second');

Katman yazılımları atarken, tam nitelikli sınıf adını da gönderebilirsiniz:

use App\Http\Middleware\CheckAge;

Route::get('admin/profile', function () {
    //
})->middleware(CheckAge::class);

 

Middleware Grupları

Bazen, yollara atanmalarını kolaylaştırmak için birkaç katman aracını tek bir tuşla gruplamak isteyebilirsiniz. Bunu $middlewareGroupsHTTP çekirdeğinin mülkünü kullanarak yapabilirsiniz.

Laravel, web kullanıcı arayüzüne webve apiAPI rotalarına uygulamak isteyebileceğiniz ortak katmanlı yazılım içeren katmanlı yazılım gruplarıyla birlikte gelir :

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'auth:api',
    ],
];

Middleware grupları, tek tek katman yazılımıyla aynı sözdizimini kullanarak yollara ve denetleyici eylemlerine atanabilir. Yine, ara katman grupları, bir seferde bir ara katmanı çok sayıda ara katman atamak için daha kolay hale getiriyor:

Route::get('/', function () {
    //
})->middleware('web');

Route::group(['middleware' => ['web']], function () {
    //
});

 

Kutudan, webara katman grubu otomatik uygulanır tarafından dosyaya .routes/web.phpRouteServiceProvider

 

Middleware Parametreleri

Middleware ayrıca ek parametreler de alabilir. Örneğin, uygulamanız, kimliği doğrulanmış kullanıcının belirli bir işlemi gerçekleştirmeden önce belirli bir "rolü" bulunduğunu doğrulaması gerekiyorsa, CheckRoleek bir argüman olarak bir rol adı alan bir katman oluşturabilirsiniz.

Argümantan sonra ara katman yazılımlarına ek katman parametreleri iletilecek $next:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckRole
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string  $role
     * @return mixed
     */
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // Redirect...
        }

        return $next($request);
    }

}

Middleware parametreleri, katman adı ve parametrelerini a ile ayırarak rota tanımlarken belirtilebilir :. Birden fazla parametre virgülle ayrılmalıdır:

Route::put('post/{id}', function ($id) {
    //
})->middleware('role:editor');

 

Sonlandırılabilir Middleware

HTTP yanıt tarayıcıya gönderildikten sonra bazen ara katmanın bazı işler yapması gerekebilir. Örneğin Laravel ile birlikte gelen "session" katmanı, yanıt tarayıcıya gönderildikten sonra oturum verisini depola yazıyor. terminateOrta katmanınızda bir yöntem tanımlarsanız, yanıt tarayıcıya gönderildikten sonra otomatik olarak çağrılır.

<?php

namespace Illuminate\Session\Middleware;

use Closure;

class StartSession
{
    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // Store the session data...
    }
}

terminateYöntem istek ve yanıt hem de uygulanmalıdır. Sonlandırılabilir bir ara katmanı tanımladıktan sonra, dosyadaki rota veya genel ara katman listesine eklemelisiniz .app/Http/Kernel.php

Ara terminatekatman üzerinde yöntemi çağırırken, Laravel servis kabından ara katmanın yeni bir örneğini çözecektir . Aynı yöntem katmanı örneği handleve terminateyöntemleri çağrıldığında kullanmak istiyorsanız, katmanın yöntemini kullanarak ara katmanı kapsayıcıya kaydedin singleton.

Henüz Yorum Yapılmamış, İlk Yorumu Siz Yapın

Yorum Yollayın