Laravel: 中间件是否可以接受路由输入?

Laravel: is it possible for middleware to accept route input?

我想要实现的是,我在几个国家有观众。我在不同国家也有编辑。

例如,美国编辑只能编辑和查看 US, editor in Hong Kong 中的帖子,不允许查看美国帖子。

Route::get('{country}/posts', [
    'uses' => 'CountryController@posts',
    'middleware' => ['permission:view posts,{country}'], <------- SEE HERE
]);

有可能实现吗?

P/S:我正在使用 Spatie laravel-permission

不可能,但我在中间件中使用了这行代码:

$country = $request->route('country'); // gets 'us' or 'hk'

此方法 Request returns 路线段。

创建另一个中间件更容易,像这样:

namespace App\Http\Middleware;

use Closure;

class CountryCheck
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // The method `getEnabledCountries` returns an array 
        // with the countries enabled for the user
        if(in_array($request->route('country'), Auth::user()->getEnabledCountries())) {
           return $next($request);
        }

        // abort or return what you prefer

    }
}

无论如何...如果用户只能看到他所在国家/地区的帖子,country 参数在我的建议中是无用的...如果您已经知道用户区域设置并且您已经有了此规则...为什么你必须再做一次检查?

在我看来,最好创建一个像 Route::get('posts') 这样的路由,并在控制器内部加载与用户所在国家/地区相关的帖子...类似于:

Post::where('locale', '=', Auth::user()->locale())->get()

或范围:

Post::whereLocale(Auth::user()->locale())->get()