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

时间:2018-08-16 09:58:48

标签: laravel middleware laravel-middleware spatie

我想实现的目标是,我在几个国家/地区拥有受众。我在不同的国家也有编辑。

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

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

有可能实现这一目标吗?

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

2 个答案:

答案 0 :(得分:1)

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

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()

答案 1 :(得分:0)

这是不可能的,但是我在中间件中使用以下代码行:

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

Request方法返回路由段。