如何(正确)使用表单请求+策略+具有依赖关系的资源路由?

时间:2017-11-09 11:20:13

标签: php laravel rest authentication policy

我的用例是用户/拥有一家拥有员工的公司。

使用表单控制器和模型策略我试图找出最佳/正确的方法应该是什么。

路线:

list.count { it == "apple" }

员工店铺请求:     

    Route::resource('company', \App\Http\Controllers\Api\v1\CompanyController::class);
    Route::resource('employee', \App\Http\Controllers\Api\v1\EmployeeController::class);

员工政策:

namespace App\Http\Requests;

use App\Models\Employee;
use Illuminate\Foundation\Http\FormRequest;

class EmployeeStoreRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return $this->user()->can('create', Employee::class);
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'company_id' => 'required|integer|exists:companies,id'
        ];
    }
}

所以我对政策如何检查用户是否可以编辑员工所属的公司并不是特别高兴,因为这只发生在http上,对于控制台/测试,这将会中断。

然后,添加此检查的最合理方式是使用表单请求的authorize()函数,但是您正在检查策略之外的权限,这听起来不合逻辑。

简而言之,问题是:&你为什么要使用表格请求&模范政策?

1 个答案:

答案 0 :(得分:2)

您只需要将公司的id添加到EmployeePolicy@create方法,您就可以在http

之外使用它了

EmployeePolicy

public function create(User $user, $companyId)
{
    return $user->can('update', $companyId);
}

EmployeeStoreRequest

public function authorize()
{
    return $this->user()->can('create', Employee::class, $this->request->get('company_id'));
}

您可以使用tinker

在http外进行测试
php artisan tinker
$user = User::find(2); // or whatever user you want to test with
$user->can('create', Employee::class, 3); // 3 = company_id