Search code examples
laravellaravel-medialibrary

Error when using Spate Media Library: "BadMethodCallException Call to undefined method Illuminate\Foundation\Auth\User::addMediaFromRequest()"


This is my User Model

    namespace App;
    use Illuminate\Database\Eloquent\Model;
    use Spatie\MediaLibrary\HasMedia\HasMedia;
    use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
    use Spatie\MediaLibrary\File;
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Contracts\Auth\MustVerifyEmail;
    use Illuminate\Foundation\Auth\User as Authenticatable;

    class User extends Authenticatable  implements HasMedia

    {

        use HasMediaTrait;
        use Notifiable;

        protected $fillable = [
            'name', 'email', 'password',
        ];

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

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

        public function role(){
            return $this->belongsToMany('App/Role');
        }


    }

This is my UserController

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
public function store(Request $request)
    {
        $user=new User;
        $user->name=($request['name']);
        $user->email=($request['email']);
        $password=bcrypt($request['password']);
        $user->password=$password;

        $user_photo=$request['photo'];

        $user->addMediaFromRequest('photo')->toMediaCollection('images');


        $user->save();
        return redirect('/admin');

    }
}

I want to use Spatie Media Library and upload a photo for each user but I get this error related to Spatie Library:

"Call to undefined method Illuminate\Foundation\Auth\User::addMediaFromRequest()".

I have read some related posts but I don't understand how to fix this. Thank you.


Solution

  • Version 8 of the library has this documentation. Are you using the correct trait?

    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    use Spatie\MediaLibrary\HasMedia;
    use Spatie\MediaLibrary\InteractsWithMedia;
    
    class YourModel extends Model implements HasMedia
    {
        use InteractsWithMedia;
    }
    

    Edited:

    On another note, using HasMediaTrait is for version 7 so I assume you're using version 7. I think it's because you're importing the wrong User class. The User class used to implement HasMedia lies in the App\User namespace. But you're importing the User class from the Illuminate\Foundation\Auth\User namespace. So change it to use App\User; and you should be fine.

    namespace App\Http\Controllers;
    
    use App\User;
    use Illuminate\Http\Request;
    
    class UserController extends Controller
    {
    public function store(Request $request)
        {
            $user=new User;
            $user->name=($request['name']);
            $user->email=($request['email']);
            $password=bcrypt($request['password']);
            $user->password=$password;
    
            $user_photo=$request['photo'];
    
            $user->addMediaFromRequest('photo')->toMediaCollection('images');
    
    
            $user->save();
            return redirect('/admin');
    
        }
    }
    

    https://docs.spatie.be/laravel-medialibrary/v8/basic-usage/preparing-your-model/