我正在用Laravel 5.3构建一个API。我有途径,如/users/1
,users/1/teams
等Laravel 5.3 - 内部重定向或修改请求中间件
我想客户端应用程序也可以使用URI像/users/self
,/users/self/teams
。
我一直在寻找到建设一个检查,看看是否/self/
是在请求URI的中间件,并且如果是,则改变/self/
到用户的实际ID,或者做一个内部重定向到所请求的端点。
有关我如何做到这一点的任何想法?
我正在用Laravel 5.3构建一个API。我有途径,如/users/1
,users/1/teams
等Laravel 5.3 - 内部重定向或修改请求中间件
我想客户端应用程序也可以使用URI像/users/self
,/users/self/teams
。
我一直在寻找到建设一个检查,看看是否/self/
是在请求URI的中间件,并且如果是,则改变/self/
到用户的实际ID,或者做一个内部重定向到所请求的端点。
有关我如何做到这一点的任何想法?
更改您的请求并不是一个很好的做法,您不应该触摸它,那么您为什么不创建一个用户存储库并在那里执行该操作?
<?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)]);
}
}
如果您不使用'private $ auth;'(以及所有的糖),它的用途是什么? – Kyslik
创建中间件和使用它:
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 = [];
}
请问您是否可以发布一些代码并显示一个请求。然后,我们可以试着帮助你理解它有什么问题。 – Hannu
格式路径更具可读性 – Technotronic