Laravel 5.3中间件请求合并不返回任何值

时间:2016-08-24 09:56:50

标签: laravel

我的所有代码都在使用Laravel 5.2。现在我尝试升级到Laravel 5.3,它打破了中间件。

// Verify Middleware
public function handle($request, Closure $next)
{
    // I already make sure the data is exists
    $user = User::find('abc');

    if (!$user) {
        return responseHandler()->unauthorized('Unauthorized');
    }

    $request->merge(['user_id' => $user->id, 'device' => $device]);

    return $next($request);
}

// User Controller
 public function __construct(Request $request)
{
    var_dump($request->all());
    $this->user_id = $request->user_id;
    $this->device = $request->device;
}

public function getProfile(Request $request)
{
    $data = User::find($this->user_id);

    $result = Fractal::item($data, new UserTransformer)->getArray();

    return responseHandler()->success(0, $result, 'user');
}

问题是$this->user_id始终为空。但是如果我从getProfile函数请求它正确返回。

var_dump仅生成登录信息。它没有收到来自中间件的任何合并请求

在Laravel 5.2上,此代码正常运行。任何解决方案?。

2 个答案:

答案 0 :(得分:1)

参考 - :https://www.laravel.com/docs/5.3/upgrade#upgrade-5.3.0

构造函数中的会话

在以前版本的Laravel中,您可以在控制器的构造函数中访问会话变量或经过身份验证的用户。这从未打算成为框架的明确特征。在Laravel 5.3中,您无法访问控制器构造函数中的会话或经过身份验证的用户,因为中间件尚未运行。

作为替代方案,您可以直接在控制器的构造函数中定义基于Closure的中间件。在使用此功能之前,请确保您的应用程序正在运行Laravel 5.3.4或更高版本:

  <?php

  namespace App\Http\Controllers;
  use App\User;
  use Illuminate\Support\Facades\Auth;
  use App\Http\Controllers\Controller;

 class ProjectController extends Controller
{
/**
 * All of the current user's projects.
 */
protected $projects;

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware(function ($request, $next) {
        $this->projects = Auth::user()->projects;

        return $next($request);
    });
}

}

当然,您也可以通过在控制器操作上键入Illuminate \ Http \ Request类来访问请求会话数据或经过身份验证的用户:

答案 1 :(得分:0)

似乎您无法在Controller构造函数中访问会话数据,因为中间件尚未运行。

参考laravel change log here

  

您无法访问您的会话或经过身份验证的用户   控制器的构造函数,因为中间件还没有运行。

在您的情况下,您可以使用请求对象

调用会话
public function getProfile(Request $request)
{
    $data = User::find($request->session()->get('user_id'));

    $result = Fractal::item($data, new UserTransformer)->getArray();

    return responseHandler()->success(0, $result, 'user');
}