我这样授权商店
public function store( Request $request)
{
$this->authorizeApi('store',JobPost::class, $request);
return $this->jobPostRepository->store($request);
}
在政策中,我的存储方式如下
public function store(Request $request)
{
$user=auth()->user();
return ($user->company_id == $request->company_id)
&&($request->expiration_date->isAfter($request->publish_date))
&&($request->publish_date->isAfter(now()))
;
}
当我运行它时,我得到
"Argument 1 passed to App\Policies\JobPostPolicy::store() must be an instance of Illuminate\Http\Request, instance of App\Models\User given, called in C:\xampp\htdocs\balatar1\vendor\laravel\framework\src\Illuminate\Auth\Access\Gate.php on line 481"
当我在控制器中dd发出请求就可以了,但是当我在策略上dd时它会返回一个空的User对象!为什么呢?
答案 0 :(得分:1)
您犯了一些错误,错过了一些东西。
据我所知,您有一些公司,每个Company
都有一些JobPost
。
首先,您不应该在职位发布请求的正文中传递公司ID,而您的商店路线应该类似于https://example.com/company/{company_id}/job-post
,那么您就可以通过Laravel模型绑定来捕获公司模型!
因此您的路线应定义为:
Route::group(['prefix' => 'company', 'as' => 'company.'], function () {
Route::group(['prefix' => '{company}'], function () {
Route::resource('job-post', 'JobPostController', ['parameters' => ['job-post' => 'jobPost']);
});
Route::resource('', 'ComapnyController', ['parameters' => ['' => 'company']);
}
您的控制器看起来像(我将在答案的第二部分解释JobPostRequest
)
class JobPostController extends Controller
{
public function store(JobPostRequest $request, Company $company)
{
$this->authorizeApi('store', [JobPost::class, $company]);
// the rest...
}
}
第二,您需要一个Request类来为您做验证。
首先基于documentation,您必须创建一个Request
类,然后它需要运行php artisan make:request JobPostRequest
然后您的职位要求应该是这样的:
class BaseRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|max:255',
'body' => 'required|max:65535',
];
}
}
您也可以使用上述类authorize
的方法来执行策略中的操作,但不建议这样做。
第三,在策略(JobPostPloicy
中,您必须检查当前登录的用户是否能够为给定的$company
发布职位。
P.S。请完全复制并粘贴所有依赖关系的类,并花更多时间来证明您的帖子。如果很难写下您的问题,那么很难正确阅读,理解和回答。