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

cant pass the request to policy so i can validate some issues

我授权这样的商店

    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"

当我在控制器中添加请求时它没问题,但是当我在策略中添加它时它返回一个空的用户对象!!!这是为什么?

你犯了一些错误,错过了一些东西。

据我所知,您有一些公司,每个 Company 都有一些 JobPost

首先,你不应该在工作 post 请求中传递你的公司 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...
    }
}

其次,您需要一个请求 class 来为您进行验证。

基于documentation首先你必须创建一个Requestclass,然后它需要运行php artisan make:request JobPostRequest

那么你的工作 post 请求应该是这样的:

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',
        ];
    }
}

您也可以按照上述 class authorize 方法执行您在保单中所做的操作,但不推荐这样做。

第三,在您的政策 (JobPostPloicy) 中,您必须检查当前登录的用户是否能够 post 给定 $company 的工作。

P.S。请完全复制并粘贴您的 classes 以及所有依赖项,并多花一点时间来完善您的 post。如果这很难写出您的问题,那么这也很难阅读、理解和正确回答。