Laravel框架对于中间件{参数}的深入运用以及请求参数的实战

2022-12-16 15:31:03 浏览数 (1)

Larravel

Larravel Breeze为构建Larravel应用程序提供了一个简单且最小化的起点,而Jetstream通过更强大的功能和额外的前端技术堆栈增强了应用程序功能。对于刚接触Lavel的人,我们建议在学习Lavel Jetstream之前先学习Lavel Breeze。 Jetstream为Lavel提供了设计精美的应用程序脚手架代码,包括登录、注册、邮箱验证、双重身份验证、会话管理、基于Lavel Sanctum的API支持以及可选的团队管理功能。Jetstream使用Tailwind CSS设计样式,并提供Livewire或Inertia Js驱动的前端脚手架技术堆栈供选择。

中间件:

所见,如果请求参数中的age小于或等于200,中间件将向客户端返回HTTP重定向;否则,请求将被传递。可以通过调用回调函数

next并传递当前的

request来传递请求。 注意:此时,只定义了中间件的逻辑。为了使中间件有效,需要在指定的路由中注册它。我们很快将在下面的注册中间件部分中教如何做到这一点。 理解中间件的最佳方法是将其视为HTTP请求在到达目标操作之前必须经过的“层”。每一层将检查请求,并可以完全拒绝它。 注意:所有中间体都在服务容器中解析,因此可以在中间件的构造函数中提示任何依赖项。

代码语言:javascript复制
<?php
namespace AppHttpMiddleware;
use Closure;
class CheckAge
{
    public function handle($request, Closure $next)
    {
        if ($request->age <= 200) {
            return redirect('/');
        }

        return $next($request);
    }
}
代码语言:javascript复制
<?php

namespace AppHttpMiddleware;

use Closure;

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

        return $next($request);
    }
}
代码语言:javascript复制
<?php

namespace AppHttpMiddleware;

use Closure;

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

        // Perform action

        return $response;
    }
}

将中间件分配给指定的路由,如果要将中间件分配给指定的路由,应首先在app/Http/Kernel中设置。默认情况下,此类的$routeMiddleware属性包含Larravel提供的中间件。要添加自己的中间件,只需将其附加到以下内容并为其分配一个密钥。

代码语言:javascript复制
Route::get('/hello', function () {
    //
})->middleware('age', 'auth');

有时可能希望通过指定密钥名称将相关中间件分配给同一组,以便更容易地将其分配给路由。这可以通过使用HTTP内核提供的$middlewareGroups属性来实现。 Larravel提供了两个开箱即用的中间件组:web和api,它们分别包含可应用于web和api路由的通用中间件:

代码语言:javascript复制
protected $middlewareGroups = [
    'web' => [
        AppHttpMiddlewareEncryptCookies::class,
        IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
        IlluminateSessionMiddlewareStartSession::class,
        IlluminateViewMiddlewareShareErrorsFromSession::class,
        AppHttpMiddlewareVerifyCsrfToken::class,
        IlluminateRoutingMiddlewareSubstituteBindings::class,
    ],

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

中间件参数

终端中间件可以理解为后端处理中间件。有时,在HTTP响应发送到浏览器后,中间件可能需要做一些工作。例如,Larave中内置的会话中间件将在响应发送到浏览器后将会话数据写入内存。要实现此功能,您需要定义一个终止中间件,并向中间件添加一个终止方法 终止方法将接收请求和响应作为参数。在定义了终端中间件之后,需要将其添加到app/Http/Kernel PHP文件中。 在中间件上调用terminate方法时,Larravel将从服务容器中获取中间件的新实例。如果要在调用handle和terminate方法时使用相同的中间件实例,则需要使用容器提供的singleton方法以单个实例的方式将中间件注册到容器中。通常,这需要在AppServiceProvider PHP注册方法中完成:

代码语言:javascript复制
<?php
    
namespace IlluminateSessionMiddleware;
    
use Closure;
    
class StartSession
{
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
    
    public function terminate($request, $response)
    {
        // 存储session数据...
    }
}
代码语言:javascript复制
use AppHttpMiddlewareTerminableMiddleware;
    
/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    $this->app->singleton(TerminableMiddleware::class);
}

在HTTP内核中定义中间件后,可以使用中间件方法将其分配给路由

0 人点赞