我正在用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