Ошибка «Вызов неопределенного метода» при попытке использования функции hasFile () - PullRequest
1 голос
/ 02 апреля 2019

Я делаю свои первые шаги в Laravel 5.8.Начиная с учебных пособий по Laracast, я использую стандартный проект приложения Laravel и аутентификацию пользователя из коробки, так что ничего особенного здесь нет.После того, как пользователь войдет в систему, он сможет получить доступ к панели управления и изменить часть своей собственной пользовательской информации, которая хранится в таблице Users в MySQL.

Все отлично работает, за исключением загрузки файла через переменную mediator_cert.При проверке, добавил ли пользователь файл для загрузки (т. Е. mediator_cert не должен быть нулевым), я получаю ошибку Call to undefined method konsens24\User::hasFile(), т.е. кажется, что Laravel ожидает, что метод будет определен в файле user.php, которыйтам не содержится (я был бы удивлен, если бы он был явно включен там?).

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

Файл User.php:

<?php

namespace konsens24;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;


class User extends Authenticatable
{
    use Notifiable;


    protected $fillable = [
    'first_name', 'last_name','name', 'email', 'password', 'street', 'postal', 'city', 'state', 'country', 'phone', 'mediator', 'mediator_cert'
    ];


protected $hidden = [
    'password', 'remember_token',
];


protected $casts = [
    'email_verified_at' => 'datetime',
];

public function projects()
{
  return $this->hasMany(Project::class, 'owner_id');
}
}

Файл ProfileController.php:

<?php

namespace konsens24\Http\Controllers;

use Illuminate\Http\Request;
use konsens24\User;


class ProfileController extends Controller
{
  public function __construct()
  {
    $this->middleware('auth');

  }


  public function show(User $user)
  {

      $user = auth()->user();

      return view('profile.edit', compact('user'));
  }


  public function update(User $user)
  {

    abort_if($user->id !== auth()->id(), 403);

    //Handle File Upload
      if($user->hasFile('mediator_cert')){
       //Get filename with the extension
       $filenameWithExt = $user->file('mediator_cert')->getClientOriginalName();

        //Get just filename
        $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME);

        //Get just ext
        $extension = $user->file('mediator_cert')->guessClientExtension();
        //FileName to store
        $fileNameToStore = $filename.'_'.time().'.'.$extension;

        //Upload Image
         $path = $user->file('mediator_cert')->storeAs('public/certs/', $fileNameToStore);
      }

    $user->update($this->validateUser());

    return view('profile.edit', compact('user'));

  }


  protected function validateUser()
  {
    return request()->validate([
      'street' => ['required', 'min:3', 'max:30'],
      'postal' => ['required', 'min:3', 'max:7'],
      'city' => ['required', 'min:3', 'max:30'],
      'state' => ['max:30'],
      'country' => ['required', 'min:1', 'max:30'],
      'phone' => ['required', 'min:9', 'max:30'],
      'mediator' => ['boolean'],
      'mediator_cert' => ['nullable']
    ]);
  }
}

Файл edit.blade.php:

@extends('layouts.app')

@section('content')
  <h1 class="title">Profile Settings</h1>

  <p>Please complete your profile by adding the following information:</p>

  <form method="post" action="/profile/{{ $user->id }}" enctype="multipart/form-data">
    @method('PATCH')
    @csrf

    ...

    <div class="field">
      <label class="label" for="mediator_cert">Certification (upload as PDF, Word Document DOCX, or JPG)</label>
      <div class="control">
        <input type="file" name="mediator_cert">
      </div>
    </div>

    <br>

    <div class="field">
        <div class="control">
        <button type="submit" class="button">Update Profile</button>
      </div>
    </div>

    @include('errors')

  </form>


@endsection

Ожидаемый результат должен заключаться в том, что метод hasFile () может быть выполнен,Большое спасибо за помощь в этом!

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Спасибо, Амин, это сработало! Вот что я изменил:

 public function update(User $user, Request $request)
 {

 abort_if($user->id !== auth()->id(), 403);


//Handle File Upload

  if($request->hasFile('mediator_cert')){

   //Get filename with the extension
   $filenameWithExt = $request->file('mediator_cert')->getClientOriginalName();

    //Get just filename
    $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME);

    //Get just ext
    $extension = $request->file('mediator_cert')->guessClientExtension();
    //FileName to store
    $fileNameToStore = $filename.'_'.time().'.'.$extension;

    //Upload Image
     $path = $request->file('mediator_cert')->storeAs('public/certs', $fileNameToStore);
     $user->mediator_cert = $fileNameToStore;
  }


$user->update($this->validateUser());


return view('profile.edit', compact('user'));

  }
0 голосов
/ 02 апреля 2019

Вы должны ввести \ Illuminate \ Http \ Request $ request как ProfileController @ update

и используйте $ request-> hasFile () вместо $ user-> hasFile () в методах также используйте $ request-> file () или $ request-> get () для получения параметров данных Post, Get Form

удачи

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