我的用例是用户/拥有一家拥有员工的公司。
使用表单控制器和模型策略我试图找出最佳/正确的方法应该是什么。
路线:
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()函数,但是您正在检查策略之外的权限,这听起来不合逻辑。
简而言之,问题是:&你为什么要使用表格请求&模范政策?
答案 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
php artisan tinker
$user = User::find(2); // or whatever user you want to test with
$user->can('create', Employee::class, 3); // 3 = company_id