【问题标题】:Laravel 5.3 - Internal redirect or modify request middlewareLaravel 5.3 - 内部重定向或修改请求中间件
【发布时间】:2017-04-19 18:26:32
【问题描述】:

我正在使用 Laravel 5.3 构建 API。我有/users/1users/1/teams等路线。

我希望客户端应用程序也能够使用像 /users/self/users/self/teams 这样的 URI。

我正在研究构建一个中间件,检查 /self/ 是否在请求 URI 中,如果是,则将 /self/ 更改为用户的实际 id,或者对请求的端点进行内部重定向。

关于如何做到这一点的任何想法?

【问题讨论】:

  • 您能否发布一些代码并显示尝试,拜托。然后,我们可以尝试帮助您了解其中的问题。
  • 格式化路径以提高可读性

标签: php laravel-5 laravel-middleware


【解决方案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 = [];
}

【讨论】:

    【解决方案2】:

    更改您的请求不是一个很好的做法,您不应该碰它,那么您为什么不直接创建一个用户存储库并在其中执行此操作呢?

    <?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;(以及所有的糖)有什么用?
    猜你喜欢
    • 1970-01-01
    • 2017-04-18
    • 2017-06-25
    • 2017-04-22
    • 1970-01-01
    • 2015-08-13
    • 2017-12-15
    • 2017-04-05
    • 2017-04-12
    相关资源
    最近更新 更多