Я создаю следующий репозиторий для загрузки файлов. Мне нужно проверить размер файла и, если проверка не пройдена, перенаправить обратно на форму с ошибками. Но когда checkSize терпит неудачу, перенаправление не происходит. В чем проблема?

<?php
namespace app\Repositories;

class UploadFileRepository
{
    public $fileNames=[];
    protected $maxSize=2097152;
    public function upload($files){
        foreach ($files as $file){
            if(!empty($file)){
                $filename=$file->getClientOriginalName();
                $this->checkSize($file);
                $this->fileNames[]=$filename;
                $file->move(base_path().'/public/uploads/', $filename);
            }
        }
    }
    protected function checkSize($file){
        $fileSize=$file->getClientSize();
//        dd($fileSize);
        $filename=$file->getClientOriginalName();
        if ($fileSize == 0) {
          return  redirect()->back()->withInput()->withErrors([ $filename. ' is empty.']);
        } elseif ($fileSize > $this->maxSize) {
            return redirect()->back()->withInput()->withErrors([ $filename. ' is too large.']);
        } else {
            return true;
        }
    }
}
0
Ali Erfani 12 Авг 2015 в 18:23
1
Вопрос может быть следующим: (1) Вызывается ли upload()? и (2) Выполняется ли цикл foreach или условие if()? Кажется, нет никакого резерва, если есть пустой файловый массив или пустой файл...
 – 
Rob W
12 Авг 2015 в 18:30
1
Ваш репозиторий не должен никого никуда перенаправлять. Это зависит исключительно от вашего контроллера.
 – 
Joseph Silber
12 Авг 2015 в 18:41
В чем ошибка, которую он возвращает?
 – 
Miharbi Hernandez
12 Авг 2015 в 18:42
1
- два варианта: 1) вызвать checkSize с вашего контроллера и вернуть логическое значение. 2) выдать ошибку, поймать ее в своем контроллере и перенаправить.
 – 
Joseph Silber
12 Авг 2015 в 18:58
1
Кстати, у laravel также есть помощник back(), который вы можете использовать напрямую. Нет необходимости в redirect()->back().
 – 
Joseph Silber
12 Авг 2015 в 20:09

2 ответа

Вам нужно вернуть ответ в вашей функции upload (или любой другой функции, которую вызывает ваш маршрут). В вашем коде checkSize возвращает ответ, если есть ошибка, но upload не возвращает его, поэтому он просто теряется.

Вот что вы можете сделать:

class UploadFileRepository
{
    public $fileNames=[];
    protected $maxSize=2097152;

    public function upload($files){
        foreach ($files as $file){
            if(!empty($file)){
                $filename=$file->getClientOriginalName();

                $error = '';
                if (!$this->checkSize($file, $error))
                    return redirect()->back()->withInput()->withErrors([ $error ]);

                $this->fileNames[]=$filename;
                $file->move(base_path().'/public/uploads/', $filename);
            }
        }
    }

    protected function checkSize($file, &$error){
        $fileSize=$file->getClientSize();
        $filename=$file->getClientOriginalName();

        if ($fileSize == 0) {
            $error = $filename . ' is empty.';
            return false;
        } elseif ($fileSize > $this->maxSize) {
            $error = $filename . ' is too large.';
            return false;
        } else
            return true;
    }
}
2
Adrien Neveu 12 Авг 2015 в 18:44
Ваш маршрут вызывает UploadFileRepository@upload ? Если это не так (кажется, что нет), добавьте return upload($files); в функцию, которую вызывает ваш маршрут.
 – 
Adrien Neveu
12 Авг 2015 в 18:47
Нет, я вызываю метод загрузки в своем контроллере.
 – 
Ali Erfani
12 Авг 2015 в 18:59
1
Ну, как я уже сказал, ваш контроллер должен возвращать redirect()->back(), если в upload() есть ошибка.
 – 
Adrien Neveu
12 Авг 2015 в 19:16

Вы можете попробовать: return back()->with('error','Сообщение об ошибке');

1
Taulut Hossain Washi 24 Окт 2015 в 08:54