я использую Динго / апи пакет.
контроллер:
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
, но все тот же.
Для Динго работать с СформироватьЗапрос, по опыту (и от Эта проблема), вы должны использовать Динго Форма запроса т.е. 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. *
Надеюсь, поможет 🙂
Согласно 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();
}
}
Следовательно, вам нужно соответствующим образом изменить имена ваших методов и заставить их генерировать соответствующие исключения, а не возвращать логическое значение.
вам нужно явно вызвать функцию проверки при запуске ее в настройках 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, специфичное и аутентифицированное с помощью промежуточного программного обеспечения. успех