2016-12-05 105 views
2

我正在用Laravel 5.3構建一個API。我有途徑,如/users/1users/1/teamsLaravel 5.3 - 內部重定向或修改請求中間件

我想客戶端應用程序也可以使用URI像/users/self/users/self/teams

我一直在尋找到建設一個檢查,看看是否/self/是在請求URI的中間件,並且如果是,則改變/self/到用戶的實際ID,或者做一個內部重定向到所請求的端點。

有關我如何做到這一點的任何想法?

+0

請問您是否可以發佈一些代碼並顯示一個請求。然後,我們可以試着幫助你理解它有什麼問題。 – Hannu

+0

格式路徑更具可讀性 – Technotronic

回答

0

更改您的請求並不是一個很好的做法,您不應該觸摸它,那麼您爲什麼不創建一個用戶存儲庫並在那裏執行該操作?

<?php 

namespace App\Http\Controllers; 

class UsersRepository 
{ 
    private $auth; 

    public function __construct(Auth $auth) 
    { 
     $this->auth = $auth; 
    } 

    public function findById($id) 
    { 
     if ($id == 'self') { 
      return Auth::user(); 
     } 

     return User::find($id); 
    } 
} 

而且用它在你的控制器

<?php 

namespace App\Http\Controllers; 

class Games extends BaseController 
{ 
    /** 
    * @var UsersRepository 
    */ 
    private $usersRepository; 

    public function __construct(UsersRepository $usersRepository) 
    { 
     $this->usersRepository = $usersRepository; 
    } 

    public function show($id) 
    { 
     return view('show', ['user' => $this->usersRepository->findById($id)]); 
    } 
} 
+0

如果您不使用'private $ auth;'(以及所有的糖),它的用途是什麼? – Kyslik

1

創建中間件和使用它:

1)建立中間件:

文件:app/Http/Middleware/ReplaceSelfToId.php

<?php namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Http\Request; 

class ReplaceSelfToId 
{ 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle(Request $request, Closure $next) 
    { 
     if($request->route('id') == 'self') { // if id is self 
      if(!$request->user()) { // but user not instantiated 
      return redirect()->route('auth'); // redirect to auth 
      } 
      $request->route()->setParameter('id', $request->user()->id); // replace id to user's id 
     } 
     return $next($request); 
    } 
} 

2)註冊中間件Kernel.php

<?php 

namespace App\Http; 

use App\Http\Middleware\ReplaceSelfToId; // use middleware 
use Illuminate\Foundation\Http\Kernel as HttpKernel; 

class Kernel extends HttpKernel 
{ 
    /** 
    * The application's global HTTP middleware stack. 
    * 
    * These middleware are run during every request to your application. 
    * 
    * @var array 
    */ 
    protected $middleware = [ 
     \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 
     \Illuminate\Cookie\Middleware\EncryptCookies::class, 
     \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
     \Illuminate\Session\Middleware\StartSession::class, 
     \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
     ReplaceSelfToId::class // add this line to end of array (cuz have to get session initialized) 
    ]; 

    /** 
    * The application's route middleware groups. 
    * 
    * @var array 
    */ 
    protected $middlewareGroups = []; 

    /** 
    * The application's route middleware. 
    * 
    * These middleware may be assigned to groups or used individually. 
    * 
    * @var array 
    */ 
    protected $routeMiddleware = []; 
}