Estoy construyendo un proyecto de laravel que es una plataforma comunitaria, por lo que necesitará una lógica de seguidores (bastante similar a Twitter, Instagram, etc.). Ya creé la lógica para la autenticación y el perfil, pero, al investigar y escribir el código para el estado de los seguidores y verificar si el usuario está siguiendo a alguien, obtuve las funciones en mi modelo, que ahora es algo así como:
namespace App\Models; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; /** * The attributes that are mass assignable. * * @var array<int, string> */ protected $fillable = [ 'name', 'email', 'password', 'phone', 'description', 'profilepicture', 'status', ]; /** * The attributes that should be hidden for serialization. * * @var array<int, string> */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast. * * @var array<string, string> */ protected $casts = [ 'email_verified_at' => 'datetime', ]; public function following() { return $this->belongsToMany('App\Models\User', 'followers', 'follower_user_id', 'user_id')->withTimestamps(); } public function isFollowing(User $user) { return !is_null($this->following()->where('user_id', $user->id)->first()); } }Y en mi controlador de perfil, tengo:
namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Models\User; class Profile extends Controller { public function show($id) { $user = User::where('id', $id)->firstOrFail(); $me = Auth::user(); $is_edit_profile = (Auth::id() == $user->id); $is_follow_button = (!$is_edit_profile) && (!$me->isFollowing($user)); return view('profile', ['user' => $user, 'is_edit_profile' => $is_edit_profile, 'is_follow_button' => $is_follow_button]); } }Pero VSCode dice que tengo un método indefinido que sigue en mi controlador, en la línea:
$is_follow_button = (!$is_edit_profile) && (!$me->isFollowing($user));
Alguien tiene idea de por qué sucede esto? Estoy usando Laravel 8. Es uno de mis primeros grandes proyectos, por lo que anteriormente lamento cualquier error de novato. ¡Gracias por tu tiempo y ayuda!
Auth::user() devuelve un objeto de tipo Illuminate\Contracts\Auth\Authenticatable que no implementa isFollowing
Opción 1: puede agregar la anotación @var para especificar el tipo de su objeto
namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Models\User; class Profile extends Controller { public function show($id) { $user = User::where('id', $id)->firstOrFail(); /** @var User $me */ $me = Auth::user(); $is_edit_profile = (Auth::id() == $user->id); $is_follow_button = (!$is_edit_profile) && (!$me->isFollowing($user)); return view('profile', ['user' => $user, 'is_edit_profile' => $is_edit_profile, 'is_follow_button' => $is_follow_button]); } } Opción 2: puede extender la fachada de Auth creando una nueva fachada con el tipo de retorno esperado:
namespace App\Extensions\Facades; use App\Models\User; /** * @method static User user() */ class Auth extends \Illuminate\Support\Facades\Auth { }Y luego puedes usar esta fachada en lugar de la anterior.
namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Extensions\Facades\Auth; use App\Models\User; class Profile extends Controller { public function show($id) { $user = User::where('id', $id)->firstOrFail(); $me = Auth::user(); $is_edit_profile = (Auth::id() == $user->id); $is_follow_button = (!$is_edit_profile) && (!$me->isFollowing($user)); return view('profile', ['user' => $user, 'is_edit_profile' => $is_edit_profile, 'is_follow_button' => $is_follow_button]); } }