无法将请求传递给策略,因此我可以验证一些问题

问题描述 投票:0回答:1

我授权这样的商店

    public function store( Request $request)
{
    $this->authorizeApi('store',JobPost::class, $request);
    return $this->jobPostRepository->store($request);
}

在策略中,我的store方法看起来像这样

    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"

当我在控制器中请求它的确定时,但是当我在策略上删除它时,它会返回一个null用户对象!这是为什么?

api request authorization laravel-5.6 policy
1个回答
1
投票

你犯了一些错误并错过了什么。

据我所知,你有一些公司,每个Company有一些JobPosts。

首先,你不应该在工作岗位请求的主体中传递你的公司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的工作。

附:请完全复制并通过您的课程所有依赖项,并花费更多时间来满足您的帖子。如果这很难写出你的问题,那么很难阅读,理解并正确回答。

© www.soinside.com 2019 - 2024. All rights reserved.