Laravel中间件获取路由后发布数据和自定义路由键值对

时间:2017-04-27 07:11:18

标签: php laravel laravel-5

我有一条路线用于将数据发布到服务器。我想获取发布的数据并将其记录在数据库中。我可以在句柄函数

中获取表单发布数据吗?
public function handle($request, Closure $next) {
      echo "...intercept post data";
      return $next($request);
   }

其次,我有这条路线,例如,

Route::get('role',[
   'middleware' => 'Role:editor',
   'uses' => 'TestController@index',
]);

我想添加一个可以从中间件访问的自定义键值,即

Route::get('role',[
   'middleware' => 'Role:editor',
   'uses' => 'TestController@index',
   'deed' => 'Viewed registered users'
]);

在上面的路线中,我添加了密钥deed。这在laravel 5和
中是否可行 我可以在中间件中访问它吗?

2 个答案:

答案 0 :(得分:-1)

不,你不能这样做,它将无法正常工作。仅使用中间件并像Role:editor一样传递参数,其中editor是参数

public function handle($request, Closure $next, $editor)

您还可以从中间件中的$request参数访问路径信息名称,方法类型。

请记住,对于使用可能不是最佳生产方法的中间件的每个路由的每个请求,都会触发一个查询。尝试从中间件触发事件并让事件侦听器处理其余事件(插入查询等)。

答案 1 :(得分:-1)

是的,您可以从Middleware获取您的Route参数。

在您的中间件中,您可以获得“匹配的路径对象”,如下所示:

class MyMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $matchedRouteObject = $request->route();
        $next($request);
    }
}

请参阅print_r($request->route())此Route对象中有一个名为action的属性。 action属性具有匹配Route的所有参数。

假设您有一个名为“MyMiddleware”的中间件和一个名为“MyController”的控制器

routes / web.php:

Route::get('/', [
    'uses' => 'MyController@index',
    'middleware' => 'App\Http\Middleware\MyMiddleware',
    'deed' => 'View registered users'
]);

app / Http / Middleware / MyMiddleware.php:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Response;

class MyMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $matchedRouteObject = $this->route();
        $deedVariable = $mathedRouteObject->action['deed']; // here you got your variable.
        return $next($request);
    }
}