【问题标题】:The custom middleware is not working in the controller (Laravel)自定义中间件在控制器中不起作用(Laravel)
【发布时间】:2020-08-17 01:40:25
【问题描述】:

我做了一个自定义中间件来处理身份验证 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
];

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

谢谢!

【问题讨论】:

  • 您可以访问中间件中的请求,因此您不需要将来自请求的参数传递给它......控制器上的middleware 方法只是添加到控制器,它不会“运行”任何东西
  • @lagbox 但奇怪的是我看不到中间件中的 dd('') 看起来它根本不起作用
  • 因为它没有运行中间件,所以在控制器上调用middleware 方法不会“运行”它只是注册它的任何中间件,并且它是在构造函数中完成的,而不是在随机方法中。 .. 框架将获取控制器的实例,然后它可以获取在其构造函数中声明的中间件,以便构建中间件堆栈
  • @lagbox 我该如何解决?
  • @JesúsCova 从store() 方法中删除此行$this-&gt;middleware('apiauth:'.$request-&gt;api_token); 。而是在控制器的 __construct 方法中应用中间件。看我的回答here

标签: laravel


【解决方案1】:

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

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

然后你可以从$request中提取api_token

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

【讨论】:

  • 我什至看不到 dd('')
  • 从控制器方法$this-&gt;middleware('apiauth:'.$request-&gt;api_token);调用这样的中间件是不正确的。检查编辑的答案。
猜你喜欢
  • 2019-01-23
  • 2015-10-03
  • 2017-02-01
  • 2017-11-09
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多