【发布时间】: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->middleware('apiauth:'.$request->api_token);。而是在控制器的__construct方法中应用中间件。看我的回答here
标签: laravel