Мой пример использования заключается в том, что пользователь является владельцем компании, в которой есть сотрудники.
Используя контроллеры форм вместе с модельными политиками, я пытаюсь выяснить, каким должен быть лучший / правильный способ сделать это.
маршруты:
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'
];
}
}
Политика сотрудников:
...
/**
* Determine whether the user can create employees.
*
* @param \App\User $user
* @return mixed
*/
public function create(User $user)
{
return $user->can('update', Company::find(
app('request')->get('company_id')
));
}
...
Поэтому я не особенно доволен тем, как политика проверяет, может ли пользователь редактировать компанию, к которой будет принадлежать сотрудник, так как это происходит только по http, для консоли / тестов это может сломаться.
Тогда наиболее логичным способом добавить эту проверку является функция authorize () запроса формы, но затем вы проверяете разрешения вне политик, что звучит нелогично.
Короче говоря, вопрос: как & почему вы делаете это с помощью запросов формы & модель политики?
Вам нужно только добавить 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'));
}
Вы можете проверить это за пределами http с 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
Других решений пока нет …