1.前提・実現したこと
Laravelに標準装備されている認証機能「Auth」でユーザーの登録・ログイン・ログアウトは可能な状態です。ユーザーの削除機能はソフトデリート(論理削除)したいと思い、下記のReaDoubleというサイトを参考にしながらコードを書きました。
2.発生している問題・エラーメッセージ
deleted_at列に削除した日時が保存されているのに、ソフトデリートしたはずのユーザーアカウントで普通にログインやツイートが出来てしまいます。
Eloquentは、データベースから実際にレコードを削除するだけでなく、モデルを「ソフトデリート」することもできます。モデルがソフト削除されても、実際にはデータベースから削除されません。代わりに、モデルに「deleted_at」属性がセットされ、モデルを「削除」した日時が保存されます。(引用元:ReaDouble)
3.該当のソースコード
//database/migrations/2021_01_19_213508_add_column_soft_deletes_users_table.php <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class AddColumnSoftDeletesUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('users', function (Blueprint $table) { $table->softDeletes(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('users', function (Blueprint $table) { $table->dropSoftDeletes(); }); } }
//app/Models/Users.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Users extends Model { use HasFactory; use SoftDeletes; protected $table = 'users'; }
//app/Http/Controllers/AccountController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Users; use \App\Models\Tweet; use Illuminate\Support\Facades\Auth; class AccountController extends Controller { public function deleteData(Request $request) { $user = Users::find($request->user_id); $user->delete(); $tweets = Tweet::latest()->get(); return view('timeline',[ 'tweets' => $tweets, ]); } }
//resources/views/timeline.blade.php //関係ある箇所のみ <form action="{{route('delete')}}" method="post"> @csrf <input type="hidden" name="user_id" value="{{Auth::user()->id}}"> <button type="submit">退会する</button> </form>
//routes/web.php //関係ある箇所のみ Route::post('/timeline/softdelete', [App\Http\Controllers\AccountController::class, 'deleteData'])->name('delete');
4.自分で調べたことや試したこと
他にも下記のサイト等いくつか調べましたが、これらの内容だと特に問題なさそうなので、何故ソフトデリートされたはずのデータでログインやツイートが出来てしまうのか原因が分かりません。
5.使っているツールのバージョンなど補足情報
OS Mac
PHP 7.3.11
Laravel 8.18.1
追記(m.ts10806様ご確認お願いします)
//app/Http/Controllers/Auth/LoginController.php(認証時) //(変更前)関係ある箇所のみ protected $redirectTo = 'timeline'; //(変更後)関係ある箇所のみ protected function redirectTo() { if (Auth::user()->deleted_at == null) { return 'timeline'; }else{ Auth::logout(); return 'timeline'; } }
//TimelineController(投稿時) //今回のWebアプリはログインユーザーのみがツイートできる前提なので、実際は上記の認証時の変更のみで大丈夫であり、この投稿時の変更は必要ないと考えています。 //(変更前)関係ある箇所のみ public function postTweet(Request $request) { $request->validate([ 'tweet' => 'required|max:140', ]); Tweet::create([ 'user_id' => Auth::user()->id, 'name' => Auth::user()->name, 'tweet' => $request->tweet, ]); return back(); } //(変更後)関係ある箇所のみ public function postTweet(Request $request) { $request->validate([ 'tweet' => 'required|max:140', ]); if(Auth::user()->deleted_at == null) { Tweet::create([ 'user_id' => Auth::user()->id, 'name' => Auth::user()->name, 'tweet' => $request->tweet, ]); } return back(); }
回答1件
あなたの回答
tips
プレビュー