Laravel 5 Запрос - изменение данных

Я столкнулся с примером, где мне нужно изменить данные, которые должны быть проверены, то есть, когда не было отправлено ни одного слага, создать его из заголовка, а затем проверить, что оно уникально.

В запросе есть метод replace() который должен заменить входные данные по запросу, но он не работает. Кто-нибудь может пролить свет на это? Вот что у меня есть:

<?php namespace Purposemedia\Pages\Http\Requests;

use Dashboard\Http\Requests\Request;
use Illuminate\Auth\Guard;

class PageRequest extends Request {

    /**
     * [authorize description]
     * @return {[type]} [description]
     */
    public function authorize( Guard $auth) {
        return true;
    }

    /**
     * [rules description]
     * @return {[type]} [description]
     */
    public function rules() {
        // Get all data from request
        $data = $this->request->all();
        if( $data['slug'] === '' ) {
            // if the slug is blank, create one from title data
            $data['slug'] = str_slug( $data['title'], '-' );
            // replace the request data with new data to validate
            $this->request->replace( $data );
        }
        return [

            'title' => 'required|min:5|max:255',
            'slug' => 'min:5|max:255|alpha_dash|unique:pages,slug' . $this->getSegmentFromEnd(),

        ];
    }

}

1 ответ

Решение

Вы должны сделать это в formatInput метод. Данные, которые вы возвращаете в этом методе, будут использованы для проверки валидатором:

Например:

protected function formatInput()
{
    $data = $this->all();
    if( $data['slug'] === '') {
        // if the slug is blank, create one from title data
        $data['slug'] = str_slug( $data['title'], '-' );
    }

    return $data;
}

РЕДАКТИРОВАТЬ

Этот метод был в Laravel 2 месяца назад (я все еще использую эту версию), это довольно странно, он был удален.

Тот же эффект, который вы должны получить, когда вы измените вышеуказанный метод на:

public function all()
{
    $data = parent::all();
    if( $data['slug'] === '') {
        // if the slug is blank, create one from title data
        $data['slug'] = str_slug( $data['title'], '-' );
    }

    return $data;
}

EDIT2

Я положил здесь весь рабочий TestRequest учебный класс. Отправляю пустые данные и из-за измененных all() метод, даже если пустые данные, проверка проходит, потому что я вручную установил эти данные для проверки. Если я уберу это all() метод и отправить пустые данные, конечно, я буду отображать ошибки

<?php namespace App\Http\Requests;

use App\Http\Requests\Request;

class TestRequest 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 [
            //
            'title' => 'required|min:2|max:255',
            'slug' => 'min:2|max:255'
        ];
    }

    public function response(array $errors){
        dd($errors);
    }

    public function all(){
        $data = parent::all();
        $data['title'] = 'abcde';
        $data['slug'] = 'abcde';
        return $data;
    }

}
Другие вопросы по тегам