Twitterのように、ユーザーをフォローする機能を作成しています。
ユーザーがユーザーをフォローするところで、該当のControllerを作ってはいるのですが、
Target class [UserFollowController] does not exist.
と出てしまいます。
どこかが間違っているとは思うのですが、どう考えてもわかりません……
以下コードです。アドバイスいただけますと幸いです。
(Laravel 8.4を利用しております。)
【状況】
/users/1 (userのid=1のページで、Followボタンをクリックすると)・・・
以下のエラーが出ます。
■view users/{id}
<div class="row"> <aside class="col-sm-4"> <div class="card"> <div class="card-header"> <h3 class="card-title">{{ $user->name }}</h3> </div> <div class="card-body"> {{ $user->email }} </div> @if (Auth::id() != $user->id) @if (Auth::user()->is_following($user->id)) <form method="POST" action="{{ route('user.unfollow', ['id' => $user->id]) }}"> @csrf <input type="submit" class="btn btn-danger btn-block" value="Unfollow"> </form> @else <form method="POST" action="{{ route('user.follow', ['id' => $user->id]) }}"> @csrf <input type="submit" class="btn btn-primary btn-block" value="Follow"> </form> @endif @endif </div> </aside> </div>
■route(web.php)
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\MicropostsController; use App\Http\Controllers\UsersController; Route::group(['middleware' => ['auth']], function () { Route::get('users', [UsersController::class, 'index'])->name('users.index'); Route::get('users/{id}', [UsersController::class, 'show'])->name('users.show'); Route::group(['prefix' => 'users/{id}'], function () { //フォローの機能 Route::post('follow', [UserFollowController::class, 'store'])->name('user.follow'); Route::delete('unfollow', [UserFollowController::class, 'destroy'])->name('user.unfollow'); }); });
■Controller(UserFollowController)
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class UserFollowController extends Controller { public function store(Request $request, $id) { \Auth::user()->follow($id); return back(); } public function destroy($id) { \Auth::user()->unfollow($id); return back(); } }
■Model (User モデル)
<?php 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\Fortify\TwoFactorAuthenticatable; use Laravel\Jetstream\HasProfilePhoto; use Laravel\Sanctum\HasApiTokens; use Illuminate\Database\Eloquent\Model; //追加してみた class User extends Authenticatable { use HasApiTokens; use HasFactory; use HasProfilePhoto; use Notifiable; use TwoFactorAuthenticatable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', 'two_factor_recovery_codes', 'two_factor_secret', ]; public function followings() { //自分が誰をフォローしているか //return $this->belongsToMany(User::class, 'user_follow', 'user_id', 'follow_id')->withTimestamps(); techの書き方 return $this->belongsToMany('App\Models\User', 'user_follow', 'user_id', 'follow_id')->withTimestamps(); } public function followers() { //return $this->belongsToMany(User::class, 'user_follow', 'follow_id', 'user_id')->withTimestamps(); techの書き方 return $this->belongsToMany('App\Models\User', 'user_follow', 'follow_id', 'user_id')->withTimestamps(); } public function follow($userId) { //フォロー用の関数を定義 //すでにフォローしているかの確認 $exist = $this->is_following($userId); //フォロー先が自分か $its_me = $this->id == $userId; if($exist || $its_me) { return false; } else { $this->followings()->attach($userId); //attach()で中間テーブルに登録する。削除はdetach return true; } } public function unfollow($userId) { $exist = $this->is_following($userId); $its_me = $this->id == $userId; if($exist && !$its_me) { $this->followings()->detach($userId); return true; } else { return false; } } public function is_following($userId) { return $this->followings()->where('follow_id', $userId)->exists(); //exists()でbooleanが戻る } /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'email_verified_at' => 'datetime', ]; /** * The accessors to append to the model's array form. * * @var array */ protected $appends = [ 'profile_photo_url', ]; }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/04 07:07