Laravel 5.3 - Внутреннее промежуточное ПО запроса перенаправления или изменения

Я создаю API с Laravel 5.3. У меня есть такие маршруты, как /users/1, users/1/teams и т. д.

Я бы хотел, чтобы клиентские приложения также могли использовать такие URI, как /users/self, /users/self/teams.

Я искал создание промежуточного программного обеспечения, которое проверяет, находится ли /self/ в URI запроса, и если это так, то измените /self/ на фактический идентификатор пользователя или выполните внутреннее перенаправление на запрошенную конечную точку.

Любые идеи о том, как я могу это сделать?


person Adam    schedule 05.12.2016    source источник
comment
Не могли бы вы опубликовать код и показать попытку, пожалуйста. Затем мы могли бы попытаться помочь вам понять, что с ним не так.   -  person Hannu    schedule 05.12.2016
comment
Отформатируйте пути, чтобы они были более читаемыми   -  person Technotronic    schedule 06.12.2016


Ответы (2)


Создайте промежуточное ПО и используйте его:

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 = [];
}
person num8er    schedule 06.12.2016

Изменение вашего запроса - не очень хорошая практика, вы не должны его трогать, так почему бы вам просто не создать репозиторий пользователей и не сделать это там?

<?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)]);
    }
}
person Antonio Carlos Ribeiro    schedule 05.12.2016
comment
Какая польза от private $auth; (и всего сахара вокруг), если вы его не используете? - person Kyslik; 05.12.2016