如何在Lumen Mifdreware的响应之前获取路由参数



我正在使用Lumen 5.4,我需要获取路由参数并将其处理为每个请求,因此我创建了以下中间件:

namespace AppHttpMiddleware;
use Closure;
use IlluminateSupportFacadesConfig;
class StoreMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {        
        $store = $request->route()[2]['store'];
        $map = Config::get("mapping.stores");
        if(isset($map[$store])){
            Config::set(["data.stores" => $map[$store]]);
        } else {
            return response()->json([
                'status' => 'error',
                'message' => "Invalid store '$store'",
                'valid_store_list' => array_keys($map)],404);
        }
        $response = $next($request);
        return $response;
    }
}

问题在于,仅当我将$ NEXT($请求)放在之前,$ store变量才设置,但这意味着我无法通过Config ::设置在我的控制器上设置数据,因为控制器将现在在中间件之前处理。

换句话说,我要实现的是处理诸如:

之类的URL
  • domain.com/store1/costumers/
  • domain.com/store1/sellers/
  • domain.com/store2/costumers
  • domain.com/store2/sellers/

ths是我的web.php文件(尚未使卖家销售):

$app->group(['prefix' => '/{store}/costumers/', 'namespace' => 'AppHttpControllers'], function ($app) {
    $app->get('/','CostumersController@index'); //get all the routes    
    $app->post('/','CostumersController@store'); //store single route
    $app->get('/{id}/', 'CostumersController@show'); //get single route
    $app->put('/{id}/','CostumersController@update'); //update single route
    $app->delete('/{id}/','CostumersController@destroy'); //delete single route
});

我被困了一段时间,找不到解决方案。我是做错了什么,或者这是不可能实现的?

写下以下代码行,以获取任何路线的请求,

namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
use IlluminateSupportFacadesConfig;
class StoreMiddleware
{
/**
 * Handle an incoming request.
 *
 * @param  IlluminateHttpRequest  $request
 * @param  Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{        
    //your all requests coming from route
    $all = $request->all();
    //for any specific field or condition
    if($request->input('age') < 18){
       //return some error or handle code
    }       
    $store = $request->route()[2]['store'];
    $map = Config::get("mapping.stores");
    if(isset($map[$store])){
        Config::set(["data.stores" => $map[$store]]);
    } else {
        return response()->json([
            'status' => 'error',
            'message' => "Invalid store '$store'",
            'valid_store_list' => array_keys($map)],404);
    }
    $response = $next($request);
    return $response;
}
}

最新更新