Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 30.03.2018 14:41:07

Как заставить работать валидацию image в FormRequest?

Laravel 5.6.12
PHP 7.1.11
Хостинг не поддерживает REST-запросы(PUT,DELETE), только get и post
В общем, не получается провести проверку файла на изображение
есть ModelRequest

class ModelRequest extends FormRequest {

	protected $rules = [
		'image_primary' => 'required|image',
		'image_secondary' => 'nullable|image',
                 ...
	];
	protected $messages = [
		'image_primary.required' => 'Не выбрано основное изображение',
		'image_primary.image' => 'Файл основного изображения не является изображением',
		'image_secondary.image' => 'Файл дополнительного изображения не является изображением',
                ...
	];

	public function authorize() {
		...
	}


	public function rules() {
		return $this->rules;
	}

	public function messages() {
		return $this->messages;
	}
}

Этот файл работает как часы

Есть ModelUpdateRequest который наследует ModelRequest:

class ModelUpdateRequest extends ModelRequest {

	public function rules() {
		$this->rules['image_primary'] = 'nullable|image';

		return $this->rules;
	}

	public function messages() {
		return $this->messages;
	}
}

По сути он только переопределяет значение image_primary в массиве rules. И не хочет проводить валидацию, всегда выдает ошибку валидации, якобы загружаемый jpg не является изображением. Пробовал сменить правило с image на mimetypes:image/*, результат тот же. Что самое интересное, это не единственный наследующий FormRequest с валидацией на изображение, но единственный неработающий...

Не в сети

#2 30.03.2018 16:27:42

Re: Как заставить работать валидацию image в FormRequest?

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

        $imageTypeArray = array(0 => 'UNKNOWN', 1 => 'GIF', 2 => 'JPEG', 3 => 'PNG', 4 => 'BMP');
        $imageinfo = getimagesize($_FILES['file']['tmp_name'][0]);
        if (isset($imageinfo['mime'])) {
            foreach ($imageTypeArray as $key => $val) {
                if ($imageinfo[2] == $key) {
                    $succs_file = true;
                }
            }
        }
  if (isset($succs_file)) { бла бла бла
The End =)

так же можно подавать целую пачку файлов и проверять каждый на изображение и брать только изображение.
было бы интересно услышать правильное решение smile

Не в сети

#3 31.03.2018 06:45:30

Re: Как заставить работать валидацию image в FormRequest?

Костыли конечно можно наваять, но хочется все по фен-шую, что бы потом в случае необходимости долго не чесать голову.
По теме нашел подобный вопрос, но не особо понял решение...
https://laracasts.com/discuss/channels/ … -51-and-52

Не в сети

#4 02.04.2018 12:00:36

Re: Как заставить работать валидацию image в FormRequest?

я тоже плохо понимаю, но попробуйте повторить по комментам с этой урлы.
по пути  vendor/laravel/framework/src/Illuminate/Http/UploadedFile.php
открыв его, находим
use Symfony\Component\HttpFoundation\File\UploadedFile as SymfonyUploadedFile;
на UploadedFile жмякаем ctrl+b
и видем

class UploadedFile extends File
{
    private $test = false;
    private $originalName;
    private $mimeType;
    private $size;
    private $error;
бла бла

попробуйте сменить     private $test = false; на true

Изменено sam (02.04.2018 16:22:00)

Не в сети

#5 02.04.2018 15:56:43

Re: Как заставить работать валидацию image в FormRequest?

У меня работает валидация изображения:
use Illuminate\Support\Facades\Validator;

{{ Form::file('image', ['id'=>'smile', 'min'=> 1, 'max'=> 3, 'name'=>'file']) }}

в методе:

        if($request->isMethod('post')) {
            $rules = array(
                'file' => 'required|mimes:jpeg,jpg,png,bmp | max:1000', // dimensions:min_width=200,min_height=200
                'smile' => 'unique:smiles|required|max:12|min:2',
                'comment' => 'bail|required|max:200|min:2',
            );

            $validator = Validator::make($request->all(), $rules);
            if ($validator->fails()) {
                return Redirect::back()
                    ->withErrors($validator)
                    ->withInput();
            }
иначе ок
        @if (isset($errors) && count($errors) > 0)
            <div class="alert alert-danger" align="left">
                <button type="button" class="close" data-dismiss="alert">x</button>
                <div>
                    <ul>
                        @foreach ($errors->all() as $error)
                            <li>{!! $error !!}</li>
                        @endforeach
                    </ul>
                </div>
            </div>
        @endif

п.с. можно допихать image в rules но и так работает
private $test = false; // правки не понадобились

Изменено sam (02.04.2018 19:05:22)

Не в сети

Подвал раздела