Проверка запроса всегда проходит на Laravel с использованием Dingo / Api

я использую Динго / апи пакет.

контроллер:

public function register(RegisterUserRequest $request)
{
dd('a');
}

Например, поле электронной почты обязательно:

<?php namespace App\Http\Requests;class RegisterUserRequest extends Request
{
/**
* 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 [
'email' => 'required'
];
}
}

Поэтому я отправляю запрос без электронного письма и все равно получаю ответ «а».

Я тоже пытался продлить Dingo\Api\Http\Request вместо App\Http\Request, но все тот же.

3

Решение

Для Динго работать с СформироватьЗапрос, по опыту (и от Эта проблема), вы должны использовать Динго Форма запроса т.е. Dingo\Api\Http\FormRequest; так что у вас будет что-то похожее на:

<?
namespace App\Http\Requests;
use Dingo\Api\Http\FormRequest;
use Symfony\Component\HttpKernel\Exception\HttpException;class RegisterUserRequest 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 [
'email' => 'required'
];
}
// In case you need to customize the authorization response
// although it should give a general '403 Forbidden' error message
/**
* Handle a failed authorization attempt.
*
* @return mixed
*/
protected function failedAuthorization()
{
if ($this->container['request'] instanceof \Dingo\Api\Http\Request) {
throw new HttpException(403, 'You cannot access this resource'); //not a user?
}

}
}

PS: это проверено на Laravel 5.2. *

Надеюсь, поможет 🙂

1

Другие решения

Согласно Wiki

Вы должны перегрузить методы failedValidation и failedAuthorization.
Эти методы должны выдавать одно из вышеупомянутых исключений, а не ответные исключения HTTP, которые выдает Laravel.

Если вы посмотрите на Dingo \ Api \ Http \ FormRequest.php, вы увидите:

class FormRequest extends IlluminateFormRequest
{
/**
* Handle a failed validation attempt.
*
* @param \Illuminate\Contracts\Validation\Validator $validator
*
* @return mixed
*/
protected function failedValidation(Validator $validator)
{
if ($this->container['request'] instanceof Request) {
throw new ValidationHttpException($validator->errors());
}

parent::failedValidation($validator);
}

/**
* Handle a failed authorization attempt.
*
* @return mixed
*/
protected function failedAuthorization()
{
if ($this->container['request'] instanceof Request) {
throw new HttpException(403);
}

parent::failedAuthorization();
}
}

Следовательно, вам нужно соответствующим образом изменить имена ваших методов и заставить их генерировать соответствующие исключения, а не возвращать логическое значение.

0

вам нужно явно вызвать функцию проверки при запуске ее в настройках API Dingo, попробуйте что-то вроде этого (для L5.2):

Вероятно, несколько дополнительных провайдеров

...
Illuminate\Validation\ValidationServiceProvider::class,
Dingo\Api\Provider\LaravelServiceProvider::class,
...

Псевдонимы

...
'Validator' => Illuminate\Support\Facades\Validator::class,
...

Я также почти уверен, что вы действительно не хотите использовать это ниже, как предложено здесь и там. Он будет ожидать ввода в форме (в кодировке) и, вероятно, также потерпит неудачу на токене CSRF, как и ожидал, так что он потерпит неудачу правильно после проверки (форма ввода). Но не забудьте проверить поведение с этим вкл / выкл.

use Dingo\Api\Http\FormRequest;

Сделайте ваши заголовки:

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Http\Requests;
use App\Http\Controllers\Controller;

use Dingo\Api\Exception\ValidationHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

/* This can be a tricky one, if you haven't split up your
dingo api from the http endpoint, there are plenty
of validators around in laravel package
*/

use Validator;

Тогда фактический код (если вы придерживаетесь стандарта Cors,
это должен быть POST, и это обычно переводится в запрос магазина)

...
/**
* Store a newly created resource in storage.
*
* @param  \Illuminate\Http\Request  $request
* @return \Illuminate\Http\Response
*/
public function register(RegisterUserRequest $request) {
$validator = Validator::make($request->all(), $this->rules());
if ($validator->fails()) {
$reply = $validator->messages();
return response()->json($reply,428);
};
dd('OK!');
};
...

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'email'   => 'required'
// or/and 'userid'     => 'required'
];
}

Это вернет вам ответ, который вы ожидаете от валидатора. Если вы используете это с предварительно сгенерированными формами, это исправление не требуется, там валидатор включится автоматически. (не под Динго Апи).

Вы, вероятно, также нуждаетесь в них в composer.json

    "dingo/api": "1.0.*@dev",
"barryvdh/laravel-cors": "^0.7.1",

Это не проверено, наизусть, мне потребовалось 2 дня, чтобы понять это, но у меня есть отдельное пространство имен для API, специфичное и аутентифицированное с помощью промежуточного программного обеспечения. успех

0
По вопросам рекламы [email protected]