laravel策略中的多个模型

时间:2016-09-21 22:35:45

标签: php laravel laravel-5.3

我在Laravel中有两级资源,如下所示;

Route::resource("domains", "DomainsController");
Route::resource("domains/{domain}/subdomains", "SubDomainsController");

我有两个政策;

DomainPolicy.php
SubDomainPolicy.php

问题是这些域属于不同的用户,因此我必须授权这些域和子域。我可以轻松地授权DomainsController,因为我所要做的就是在AuthServiceProvider.php中Domain::class => DomainPolicy::class

在授权SubDomainsController时,当我访问SubDomain::class => SubDomainPolicy::class链接时,我可以使用相同的策略输入,例如/domains/1/subdomains/create BUT ,因为没有传递给SubDomainPolicy::class它总是阻止访问创建页面。

我在资源控制器构造函数中使用$this->authorizeResource(Domain::class)$this->authorizeResource(SubDomain::class)而没有任何参数。

我需要先将域模型传递给SubDomainPolicy,提前感谢。

1 个答案:

答案 0 :(得分:0)

我发现解决方案不是通过策略而是通过中间件。由于模型在web.php绑定,因此Domain :: class始终传递给SubDomainsController类,因此我将构造函数更改为;

public function __construct(Domain $domain) {
    $this->middleware("domain-access");
}

或者您可以在web.php上将其设置为中间件组(例如['middleware' => 'domain-access'])。

在中间件文件夹中,使用此内容创建名为DomainAccess.php的中间件;

命名空间App \ Http \ Middleware;

使用Closure; 使用Illuminate \ Auth \ Access \ AuthorizationException;

class DomainAccess
{

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure                 $next
     *
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $user   = $request->user();
        $domain = $request->domain;

        if ($domain->user_id != $user->id) {
            return redirect("/");
        }

        return $next($request);
    }
}

而且,瞧!一切都很完美。

度过美好的一天。