我的所有代码都在使用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上,此代码正常运行。任何解决方案?。
答案 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');
}