Как (правильно) использовать запросы форм + политики + маршруты ресурсов с зависимостями?

Мой пример использования заключается в том, что пользователь является владельцем компании, в которой есть сотрудники.

Используя контроллеры форм вместе с модельными политиками, я пытаюсь выяснить, каким должен быть лучший / правильный способ сделать это.

маршруты:

    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 () запроса формы, но затем вы проверяете разрешения вне политик, что звучит нелогично.

Короче говоря, вопрос: как & почему вы делаете это с помощью запросов формы & модель политики?

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'));
}

Вы можете проверить это за пределами 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
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]