主页/PHP笔记/PHP问答/框架Laravel/如何在 Laravel 中创建全局中间件

如何在 Laravel 中创建全局中间件

Bug编译狮

Bug编译狮

在 Laravel 中创建全局中间件非常简单。以下是详细步骤:

1. 创建中间件

首先,你需要使用 Artisan 命令来创建一个新的中间件。

php artisan make:middleware MyGlobalMiddleware

这将生成一个 MyGlobalMiddleware 类和对应的路由文件(例如 routes/web.php)。

2. 编辑中间件类

打开 app/Http/Middleware/MyGlobalMiddleware.php 文件,并添加一些逻辑到其中。

namespace AppHttpMiddleware;

use Closure;
use IlluminateSupportFacadesAuth;

class MyGlobalMiddleware
{
    public function handle($request, Closure $next)
    {
        // 检查用户是否已登录
        if (!Auth::check()) {
            return redirect('/login'); // 如果未登录,重定向到登录页面
        }

        // 继续处理请求
        return $next($request);
    }
}

3. 注册中间件

接下来,你需要在 app/Http/Kernel.php 文件中注册这个中间件。

protected $routeMiddleware = [
    // 其他中间件...
    'auth' => AppHttpMiddlewareAuthenticate::class,
    'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
    'myglobal' => AppHttpMiddlewareMyGlobalMiddleware::class, // 注册全局中间件
];

4. 使用中间件

现在,你可以为任何路由应用这个中间件了。你可以在路由定义时使用 middleware 方法。

Route::get('/', function () {
    return view('welcome');
})->middleware('myglobal'); // 应用全局中间件

示例代码

以下是一个完整的示例,展示了如何创建、注册和使用全局中间件:

1. 创建中间件

php artisan make:middleware MyGlobalMiddleware

2. 编辑中间件类

namespace AppHttpMiddleware;

use Closure;
use IlluminateSupportFacadesAuth;

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

        return $next($request);
    }
}

3. 注册中间件

app/Http/Kernel.php 文件中注册这个中间件:

protected $routeMiddleware = [
    // 其他中间件...
    'auth' => AppHttpMiddlewareAuthenticate::class,
    'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
    'myglobal' => AppHttpMiddlewareMyGlobalMiddleware::class,
];

4. 使用中间件

在路由定义时使用 middleware 方法:

Route::get('/', function () {
    return view('welcome');
})->middleware('myglobal'); // 应用全局中间件

通过以上步骤,你就可以在 Laravel 中成功创建并使用全局中间件。

黑板Bug讲师

黑板Bug讲师

介绍

Laravel 是一个流行的 PHP 框架,以其优雅的语法和工具而闻名,这些工具有助于快速开发 Web 应用程序。其中一种工具是中间件机制,它允许您过滤进入应用程序的 HTTP 请求。在本教程中,我们将讨论什么是中间件以及如何为 Laravel 创建全局中间件的步骤指导。

理解中间件

在Laravel中,中间件提供了一种方便的方法来检查和过滤HTTP请求,在它们到达应用程序之前。它可以用于执行各种任务,例如验证用户、记录请求或甚至阻止对某些资源的访问。

在Laravel中创建中间件。

要创建中间件,可以使用Laravel提供的Artisan命令行工具。运行以下命令:

php artisan make:middleware EnsureTokenIsValid

该命令在 app/Http/Middleware 目录下创建了一个名为 EnsureTokenIsValid 的中间件类。

中间件类结构

<?php

namespace AppHttpMiddleware;

use Closure;

class EnsureTokenIsValid
{
    public function handle($request, Closure $next)
    {
        // Perform action before the request is handled by the application

        return $next($request);
    }
}

在本课中,handle方法是你放置中间件逻辑的地方。

注册全球中间件

要全局注册中间件,需要将其添加到 app/Http/Kernel.php 文件中的中间件数组中:

protected $middleware = [
    // Other middleware
    AppHttpMiddlewareEnsureTokenIsValid::class,
];

一旦注册,中间件将在您应用程序的每个HTTP请求上执行。

实施中间件逻辑

public function handle($request, Closure $next)
{
    if ($request->input('token') !== 'secret') {
        return response('Unauthorized.', 401);
    }

    return $next($request);
}

在上述例子中,中间件检查输入令牌是否匹配预定义的字符串“秘密”。如果不是,则返回未经授权响应。

测试中间件

在实现中间件后,你应该对其进行测试以确保其按预期运行。以下是一个示例路由用于测试:

Route::get('/test', function () {
    return 'Token is valid.';
});

如果使用了无效的令牌访问该路线,您应该看到一个401未授权错误。

数据通过中间件传递。

可以使用请求的属性从中间件传递数据到应用程序。例如:

public function handle($request, Closure $next)
{
    $request->attributes->add(['token_valid' => true]);
    return $next($request);
}

要稍后在您的应用程序中访问该属性:

$tokenValid = $request->attributes->get('token_valid');

可终止的中间件

Laravel还支持在响应被浏览器接收后运行的中间件,称为可终止中间件。要使您的中间件可终止,请简单定义一个terminate方法:

public function terminate($request, $response)
{
    // This will be called after the response is sent
}

全球中间件最佳实践

在创建全球中间件时,请务必谨慎行事,因为这会影响到对应用的每一条请求。确保操作既轻量级又对于每一条请求都是必要的。

结论。

总结来说,中间件在Laravel中充当HTTP请求的强大过滤器。通过使用artisan命令和修改Kernel中的简单更改,可以轻松创建和注册全局中间件。按照本教程的步骤进行操作,您将能够利用中间件在每次请求上执行逻辑,从而实现对关键任务的集中处理机制。

长工码奴1523

长工码奴1523

在 Laravel 中创建全局中间件是通过定义一个新的中间件类并将其注册到服务提供者中来实现的。下面是如何做到这一点的一个简单例子。

首先,你需要在 config/app.php 文件中添加服务提供者的配置:

'middleware' => [
    IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
],

然后,你需要创建一个名为 MyMiddleware 的新中间件类,并覆盖 handle() 方法。这个方法将被所有路由调用之前和之后执行。

namespace AppMiddlewares;

use Closure;
use IlluminateSupportFacadesLog;

class MyMiddleware
{
    public function handle($request, Closure $next)
    {
        Log::info('Starting middleware');
        $response = $next($request);
        Log::info('Finished middleware');
        return $response;
    }
}

最后,你需要在 app/Providers/AppServiceProvider.php 中注册这个新的中间件:

use AppMiddlewaresMyMiddleware;
use IlluminateSupportServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        // Register any other services here.
    }

    public function register()
    {
        $this->app->singleton(MyMiddleware::class, function () {
            return new MyMiddleware();
        });
    }
}

现在,当你使用 Laravel 时,所有的请求都会先运行你的中间件。这可以用来检查环境是否处于维护模式(如果设置为 true),或者在其他情况下执行一些特定的任务。例如,你可以检查是否有未经授权的用户尝试访问资源,或者在生产环境中启用错误日志记录。

if (checkForMaintenanceMode()) {
    abort(503, 'Application is in maintenance mode.');
}

// 其他业务逻辑

Log::info('An authorized user has accessed the resource.');

以上就是如何在 Laravel 中创建全局中间件的简单步骤。