📜  laravel 控制器中间件示例 - PHP (1)

📅  最后修改于: 2023-12-03 15:02:37.157000             🧑  作者: Mango

Laravel 控制器中间件示例 - PHP

Laravel 是一款流行的 PHP Web 框架,其中的中间件是一个非常有用而且灵活的功能。它可以让我们在请求前或请求后对请求进行处理,从而实现很多有用的功能。控制器中间件更是在路由设置之外,提供了一种可复用的代码片段。

本文将介绍 Laravel 控制器中间件的使用,并提供代码示例。

控制器中间件

控制器中间件是 Laravel 框架中提供的一种分离可重用性代码的机制。通过控制器中间件,我们可以在控制器方法执行之前或者之后执行一些代码。这些代码可以是功能限制、用户权限、数据过滤、数据验证和操作记录等。

控制器中间件需要在控制器注册实现,在控制器中返回需要中间件策略的方法名称一起声明在路由中。

注册中间件

在 Laravel 中注册中间件,以 AuthenticateMiddleware 为例:

app/Http/Middleware 目录中创建中间件类 AuthenticateMiddleware

<?php

namespace App\Http\Middleware;

use Closure;

class AuthenticateMiddleware
{
    public function handle($request, Closure $next)
    {
        if (! $request->session()->get('logged_in')) {
            return redirect('login');
        }

        return $next($request);
    }
}

app/Providers/AppServiceProvider.php 文件的 boot 方法中注册中间件:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->registerMiddleware();

        parent::boot();
    }

    protected function registerMiddleware()
    {
        Route::middlewareGroup('auth', [
            \App\Http\Middleware\AuthenticateMiddleware::class,
        ]);
    }
}

在路由注册中声明中间件:

Route::group(['middleware' => 'auth'], function () {
    Route::get('dashboard', 'UserController@dashboard');
    Route::get('settings', 'UserController@settings');
    Route::post('settings', 'UserController@update');
});

在上述示例中,我们通过注册中间件 AuthenticateMiddleware 实现了控制器中间件,用户在未登录状态下访问需要权限的路由时,会重定向到登录页面。

示例

下面我们来看一个控制器中间件示例。假设我们需要在用户输入时记录操作日志,我们可以通过控制器中间件实现这个功能。

创建控制器 UserController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index()
    {
        return view('users.index');
    }

    public function store(Request $request)
    {
        // 存储数据
        Log::info('User created: ' . $request->email);

        return redirect()->route('users.index');
    }
}

在控制器中定义一个 store 方法,它将记录用户创建的操作日志。

创建一个控制器中间件 OperationLoggingMiddleware

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Log;

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

        Log::info('User operation: ' . $request->method() . ' ' . $request->url());

        return $response;
    }
}

在代码中,我们使用 Log 记录日志,记录用户的请求方式和请求地址。

App/Http/Kernel.php 中注册中间件:

protected $routeMiddleware = [
    //...
    'operation_logging' => \App\Http\Middleware\OperationLoggingMiddleware::class,
    //...
];

在路由中声明中间件:

Route::post('users', 'UserController@store')->middleware('operation_logging');

现在,当我们输入数据时,OperationLoggingMiddleware 中间件会在存储数据和重定向到路由之前记录操作日志。

结论

控制器中间件提供了一种可复用的代码片段,可以帮助我们在路由设置之外实现特定功能或者对请求进行处理。通过本文的介绍,希望您能了解并掌握 Laravel 控制器中间件的使用。