首页 > 解决方案 > 自定义中间件在控制器中不起作用(Laravel)

问题描述

我做了一个自定义中间件来处理 auth api 令牌,我在控制器中调用了这个中间件,但它不起作用我在中间件中添加了 dd('') 以查看它是否显示任何内容但它没有工作。

我的中间件是:

<?php

namespace App\Http\Middleware;

use Closure;

use App\ApiUser;

class ApiAuth
{
/**
 * Run the request filter.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next, $var)
{
   dd('If I put this dd it does not display anything');

    $api_user_count = ApiAuth::where('api_token', $var)->count();

    if($api_user_count == 0)
    {
        abort(403, "Auth failed")
    }
    
    return $next($request)
 }
}

我的控制器是,您如何看到我正在向中间件发送参数:

/**
 * Remove the specified resource from storage.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function store(Request $request)
{
    $this->middleware('apiauth:'.$request->api_token);

    $transaction = new Transaction;

    $transaction->folio = $request->folio;

    $transaction->dte_code = $request->dte_code;

    $transaction->cashier = $request->cashier;

    $transaction->amount = $request->amount;

    if($transaction->save())
    {
        return response()->json('Ok', 201);
    }
    else
    {
        return response()->json('Error', 400);
    }
}

我把中间件放在路径 App\Http\Middleware\ApiAuth.php

我将中间件放在 kernel.php 中,如下所示:

/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.
 *
 * @var array
 */
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,
    'apiauth' => \App\Http\Middleware\ApiAuth::class, // THIS IS THE MINE
];

奇怪的是它没有显示任何错误,就像它不存在一样,所以我想知道这有什么问题?

谢谢!

标签: laravel

解决方案


而不是从您的控制器方法手动调用中间件,您可以注册中间件以仅适用于该一种方法

public function __construct()
{
    $this->middleware('apiauth')->only(['store']);
}

然后你可以api_token$request

$api_user_count = ApiAuth::where('api_token', $request-> api_token)->get()->count();

推荐阅读