Laravel возвращает объект UploadedFile вместо пути к изображению - PullRequest
1 голос
/ 08 января 2020

В моем методе update в контроллере, когда я пытаюсь dump запрошенные данные, все атрибуты выполняются нормально, но image печатается как object, а не imagePath, который сохраняется в базе данных

enter image description here

Метод обновления

    public function update(Request $request, SlideShow $slideshow)
    {
        $slideshow->update($request->validate([
            'title_en' => 'required',
            'title_ar' => 'required',
            'link' => 'nullable|url',
            'image' => 'image'
        ]));

        dd($slideshow);
        $slideshow->uploadImage();

        session()->flash('success', __('dashboard.slideshow.edit_success'));
        return redirect()->route('admin.slideshow.index');
    }

SlideShow модель

class SlideShow extends Model
{

    protected $fillable = ['title_en', 'title_ar', 'link', 'image'];

    public function uploadImage($imageName = 'image')
    {
        if(request()->has($imageName)){

            \Storage::delete($this->image);

            $uploadedImage = request()->$imageName->store('slideshow/');

            \Image::make('storage/'.$uploadedImage)->resize(870, null, function ($constraint) {
                $constraint->aspectRatio();
            })->save();

            $this->update(['image' => $uploadedImage]);
        }
    }

    public static function search($request)
    {
        return  static::where(lang('title'), 'like', '%' . $request->search . '%')->paginate(10);
    }
}

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Это нормальное поведение. Когда запрос сделан, Laravel преобразует файлы в запросе в класс UploadedFile. Так как вы получаете доступ к проверенным данным из запроса, это то, что возвращается. Вы напрямую заполняете эти значения как атрибуты, и UploadedFile не конвертируется автоматически в путь, поэтому, вероятно, его не следует включать в первое обновление.

В любом случае, в вашем коде вы фактически включаете в вашем вопросе есть метод dd() перед вызовом метода uploadImage, и этот метод сохраняет путь и не пытается сохранить весь класс UploadedFile. Поэтому, если вы сбросите его после того, как оно, вероятно, получит правильное значение, вы можете проверить это?

Я бы сделал это так:

  public function update(Request $request, SlideShow $slideshow)
    {
        // validate first
        $data = $request->validate([
            'title_en' => 'required',
            'title_ar' => 'required',
            'link' => 'nullable|url',
            'image' => 'image'
        ]);

        // only pull the data that we can update right now
        $slideshow->update($request->only(['title_en', 'title_ar','link']));

        // handle and store image if needed
        $slideshow->uploadImage();

        session()->flash('success', __('dashboard.slideshow.edit_success'));
        return redirect()->route('admin.slideshow.index');
    }

и затем метод на модели:


    public function uploadImage($imageName = 'image')
    {
        if(request()->has($imageName)){

            \Storage::delete($this->image);

            $uploadedImage = request()->$imageName->store('slideshow/');

            \Image::make('storage/'.$uploadedImage)->resize(870, null, function ($constraint) {
                $constraint->aspectRatio();
            })->save();

            $this->update(['image' => $uploadedImage->path()]);
        }
    }
0 голосов
/ 08 января 2020

Я нашел метод с именем path, который получает реальный путь от UploadedFile объекта

, вы можете узнать больше об этом здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...