не могу передать запрос в политику, чтобы я мог проверить некоторые проблемы - PullRequest
0 голосов
/ 05 сентября 2018

я авторизирую такой магазин

    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"

когда я делаю запрос в контроллере, все нормально, но когда я делаю это в политике, он возвращает нулевой объект User !!! почему это?

1 Ответ

0 голосов
/ 07 сентября 2018

Вы сделали несколько ошибок и что-то упустили.

Как я знаю, у вас есть несколько компаний, и у каждой Company есть несколько JobPost с.

Во-первых, вы не должны указывать идентификатор своей компании в теле запроса о вакансии, вместо этого маршрут вашего магазина должен быть примерно таким: 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, чтобы выполнять проверки для вас.

на основе документации сначала вам нужно создать класс 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. Пожалуйста, полностью скопируйте и пропустите ваши уроки со всеми зависимостями и потратьте немного больше времени, чтобы украсить свой пост. Если вам сложно написать свой вопрос, его трудно прочитать, понять и правильно ответить на него.

...