2016-12-05 110 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 = []; 
}