2016-08-24 70 views
0

我所有的代碼都在Laravel 5.2上工作。現在我試着升級到Laravel 5.3,它在中間件上打破了。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結果只是登錄信息。它沒有收到來自中間件的任何合併請求

On Laravel 5.2此代碼工作正常。任何解決方案?

回答

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); 
    }); 
} 

}

當然,你也可以通過訪問請求會話數據或身份驗證的用戶類型的提示在你的控制器動作上照亮\ Http \ Request類:

0

看來你不能訪問Controller構造函數中的會話數據,因爲中間件還沒有運行。

參考laravel更改日誌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'); 
}