【问题标题】:How to get route parameters before the response in Lumen middleware?Lumen中间件响应前如何获取路由参数?
【发布时间】:2018-02-10 22:45:34
【问题描述】:

我使用的是 Lumen 5.4,我需要获取一个路由参数并将其处理到每个请求,所以我创建了以下中间件:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Config;

class StoreMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $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;
    }
}

问题是 $store 变量只有在我将 $next($request) 放在它前面时才会设置,但这意味着我无法在我的控制器上获取由 Config::set 设置的数据,因为控制器将现在在中间件之前处理。

换句话说,我想要实现的是处理如下网址:

  • domain.com/store1/costumers/
  • domain.com/store1/sellers/
  • domain.com/store2/costumers
  • domain.com/store2/sellers/

这是我的 web.php 文件(还没有做卖家):

$app->group(['prefix' => '/{store}/costumers/', 'namespace' => '\App\Http\Controllers'], 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
});

我被困了一段时间,找不到解决方案。是我做错了什么,还是 Lumen 无法做到这一点?

【问题讨论】:

    标签: lumen lumen-5.4


    【解决方案1】:

    编写以下代码行以获取来自任何路由的请求,

    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Config;
    
    class StoreMiddleware
    {
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $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;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 2015-12-25
      • 2015-09-25
      • 1970-01-01
      • 2016-04-08
      • 2015-10-27
      • 1970-01-01
      • 2015-08-15
      • 2019-07-06
      相关资源
      最近更新 更多