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()
我想要实现的是,我在几个国家有观众。我在不同国家也有编辑。
例如,美国编辑只能编辑和查看 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()