Laravel Global特定路由的范围及其子路由

时间:2016-07-14 06:37:52

标签: php laravel

假设有class Test extends Model { public $primaryKey = 'test_id'; public function questions () { return $this->belongsToMany('App\Question', 'question_test', 'test_id', 'question_id')->withPivot('weight'); } } 这样的模型:

Question

这样的class Question extends Model { public $primaryKey = 'question_id'; public function tests () { return $this->belongsToMany('App\Test', 'question_test', 'question_id', 'test_id')->withPivot('weight'); } } 模型:

question_id
text
correct
active  => can be true or false
created_at
updated_at

问题模型字段是:

ManyToMany

如您所见,这两个模型之间存在http://myapp.dev/Admin/tests http://myapp.dev/Admin/test/5/questions http://myapp.dev/Admin/test/5/question/create http://myapp.dev/Admin/test/5/remove 关系。

我的应用程序中有两个单独的部分,一个用于管理员用户,另一个用于公共用户。

管理员可以对问题和测试执行任何操作。比如在测试中添加一些问题,删除,编辑等等。

但另一方面,公共用户只能测试和活动的相关问题(意味着他们的活动字段是真的)。​​

假设一些管理员路线是这些:

http://myapp.dev/Dashboard
http://myapp.dev/tests-list
http://myapp.dev/test/5/questions

一些用户路线是:

Question

为此,我知道我可以在public function scopeActive($query) { return $query->where('active', 1); } 模型中使用query-scopes这样的内容:

$test->questions->active()->get();

当我只想获取活动问题时,必须这样做:

active()

但是我有许多操作可以对用户面板上的问题执行,因此如果想要使用{{1}}方法来解决选择问题,则会很费时间。

我无法使用全局范围,因为这会影响整个项目中运行的所有问题查询。

有没有办法可以为公共用户可以看到的某些特定路由和子路由定义全局(或本地)范围?

还有其他方法可以解决这个问题吗?

更新:

除了提到的那些,用户还可以拥有一些角色。例如,管理员用户可以从管理面板切换到用户面板。在这种情况下,我想在用户面板上只显示活动问题。

1 个答案:

答案 0 :(得分:1)

您可以通过将路线包裹在中间件中来实现此目的。通过运行php artisan make:middleware HideInactiveQuestions

创建 HideInactiveQuestions.php
<?php

namespace App\Http\Middleware;

use App\Question;
use Closure;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Auth;

class HideInactiveQuestions
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        Question::addGlobalScope('active', function(Builder $builder) {
            $builder->where('active', '=', 1);
        });

        return $next($request);
    }
}

接下来,在Kernel.php

中注册您的中间件
protected $routeMiddleware = [
    ....
    'restrict.public' => \App\Http\Middleware\HideInactiveQuestions::class,
];

现在,您的范围将过滤由此中间件( restrict.public )包装的路由。