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

时间:2018-09-05 18:29:56

标签: api request authorization laravel-5.6 policy

我这样授权商店

    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对象!为什么呢?

1 个答案:

答案 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。请完全复制并粘贴所有依赖关系的类,并花更多时间来证明您的帖子。如果很难写下您的问题,那么很难正确阅读,理解和回答。