Salah satu fungsi yang jarang digunakan dalam proyek web adalah kemampuan pengguna untuk menghapus akun mereka. Pada artikel ini saya akan menunjukkan tiga kasus bagaimana hal ini dapat dilakukan: memblokir, menyembunyikan, dan benar-benar menghapus data.
Kasus 1. Blokir pengguna agar tidak login.
Terkadang ada kebutuhan untuk membatasi akses pengguna, namun semua data mereka harus tetap ada di sistem, untuk tujuan riwayat.
Jadi sebenarnya ini bukan tindakan hapus, lebih seperti a memblokir atau a “melarang”.
Untuk mencapainya, cukup tambahkan bidang pengguna meja, disebut diblokir_di.
php artisan make:migration add_blocked_at_to_users_table
Dan kemudian migrasi:
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->timestamp('blocked_at')->nullable();
});
}
Logika yang sama dengan bidang Stempel Waktu lainnya – akan menjadi NULL jika pengguna aktif, atau berisi nilai waktu saat pengguna diblokir.
Karena tindakan pemblokiran/larangan ini mungkin jarang terjadi, Anda bahkan tidak boleh membuat tombol di panel admin untuk memblokir pengguna, cukup tetapkan nilai bidang secara langsung dengan kueri SQL, seperti ini:
update users set blocked_at = NOW() where id = X;
Antitipe: sebelum diluncurkan memperbarui atau menghapus pernyataan langsung dari klien SQL, jalankan memilih pernyataan dengan klausa WHERE yang sama, untuk memastikan bahwa Anda memperbarui/menghapus entri yang benar.
Maksudku, jalankan ini dulu: pilih * dari pengguna dimana id = X;
Kemudian lihat hasilnya dan pastikan penggunanya sama. Dan baru kemudian lari memperbarui penyataan.
Sekarang, bagaimana cara memeriksa apakah pengguna diblokir? Kita mungkin harus menggunakan Middleware yang akan dilampirkan ke semua rute bersama dengan “auth”, dan jika pengguna diblokir, mereka akan diarahkan ke formulir login dengan pesan kesalahan.
Langkah 1. Hasilkan kelas Middleware.
php artisan make:middleware ActiveUser
Kemudian, di hasilkan app/Http/Middleware/ActiveUser.php:
class ActiveUser
{
public function handle($request, Closure $next)
{
if (auth()->user()->blocked_at) {
$user = auth()->user();
auth()->logout();
return redirect()->route('login')
->withError('Your account was blocked at ' . $user->blocked_at);
}
return $next($request);
}
}
Jadi, kami memaksa logout pengguna dan mengarahkan ke formulir login dengan pesan kesalahan.
Langkah 2. Daftarkan Middleware di Kernel
Maka kita perlu mendaftarkan Middleware ini app/Http/Kernel.php – kami akan memberinya nama alias pengguna_aktif:
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
// ... other middlewares
'active_user' => \App\Http\Middleware\ActiveUser::class,
];
Langkah 3. Tetapkan middleware ke Routes
Ini milik kami rute/web.php – kami akan menetapkan rute ini ke rute mana pun yang diautentikasi.
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::group(['middleware' => ['auth', 'active_user']], function() {
Route::get('/home', 'HomeController@index')->name('home');
// ... Any other routes that are accessed only by non-blocked user
});
Langkah 4. Tampilkan kesalahan pada halaman login
Terakhir, kami mengalihkan dengan pesan kesalahan, ingat ->withError(‘Akun Anda diblokir di ‘ .$user->blocked_at); di atas. Jadi kita perlu menunjukkannya secara visual.
Di dalam sumber daya/views/auth/login.blade.php kami menambahkan ini:
<div class="card-header">{{ __('Login') }}</div>
<div class="card-body">
@if (session('error'))
<div class="alert alert-danger">
{{ session('error') }}
</div>
@endif
<form method="POST" action="{{ route('login') }}">
Hasil visual:
Dalam hal ini, data pengguna tetap berada di sistem, pengguna/admin lain akan melihat riwayat tindakan mereka.
Mari kita beralih ke kasus kedua, di mana sejarah seharusnya menjadi tidak terlihat.
Kasus 2. Sembunyikan pengguna dengan penghapusan sementara.
Kasus lain ketika pengguna ingin menghapus akunnya dan menyembunyikan semua sejarah mereka dalam sistem.
Kata utamanya adalah bersembunyi. Tidak sepenuhnya menghapus. Karena mungkin beberapa data penting untuk laporan seperti angka keuangan, mereka juga mungkin berubah pikiran dan ingin dipulihkan.
Dalam hal ini, Anda harus menggunakan Eloquent Soft Deletes dan mengisinya pengguna.dihapus_at dengan nilai stempel waktu.
php artisan make:migration add_deleted_at_to_users_table
Kemudian kode Migrasi:
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->softDeletes();
});
}
Lalu, masuk aplikasi/Pengguna.php model:
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Authenticatable
{
use Notifiable, SoftDeletes;
Kemudian, hapus sementara pengguna dengan kueri SQL, sama seperti contoh sebelumnya:
update users set deleted_at = NOW() where id = X;
Atau, jika Anda memilih untuk tidak terhubung ke database, dan menggunakan Artisan Tinker, Anda dapat melakukan ini:
User::find(1)->delete();
Seperti pada kasus sebelumnya, pengguna tidak akan bisa login, tetapi hanya akan melihat pesan kesalahan default: “Kredensial ini tidak cocok dengan catatan kami.”.
Sekarang, pertanyaannya di sini adalah apa yang Anda lakukan dengan data database lain yang ada user_id atau bidang serupa, terkait dengan tabel pengguna?
Anda punya pilihan:
- Batasi penghapusan pengguna jika mereka memiliki data terkait
- Data terkait kaskade dan penghapusan sementara
- Jangan melakukan apa pun dan pastikan bahwa setiap kali Anda ingin menampilkan data terkait, tidak terjadi kesalahan. Seperti, bukannya {{ $proyek->pengguna->nama }} Mengerjakan {{ $project->pengguna->nama atau ” }}
Baca lebih lanjut tentang penghapusan sementara hubungan dalam artikel ini: Satu-Ke-Banyak dengan Penghapusan Sementara. Menghapus Induk: Batasi atau Cascade?
Kasus 3. Sebenarnya menghapus pengguna dengan semua datanya.
Sekarang, terkadang Anda perlu menghapus data pengguna dari sudut pandang hukum. Mereka hanya ingin semua datanya hilang selamanya, mereka berhak menuntut hal itu.
Sebelum benar-benar menghapus, pastikan bahwa hal tersebut tidak memengaruhi semua data yang sudah dikumpulkan, seperti laporan bulanan atau beberapa angka keuangan penting. Periksa kembali apakah Anda tidak akan mendapatkan nomor yang salah setelah menghapus pengguna.
Lalu, untuk menghapus pengguna dengan semua data terkait, ada dua metode:
Metode 1. Hapus kaskade dalam migrasi.
Jika Anda memikirkan kasus itu sejak awal proyek Anda, Anda cukup menyiapkan kunci asing di file migrasi, dengan penghapusan berjenjang.
Schema::create('posts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')
->onDelete('cascade');
Jika Anda tidak menentukannya diHapus() nilai, maka nilai defaultnya adalah RESTRICT, artinya MySQL akan mencegah record induk dihapus jika ada kunci asing.
Namun jika Anda menentukannya onDelete(‘kaskade’)maka itu akan menghapus semua posting setiap kali Pengguna dihapus, seperti Pengguna::find(1)->hapus();.
Ingat – ini terjadi terus menerus basis data level, bukan di Laravel atau Eloquent. Jadi penghapusan berjenjang akan terjadi bahkan jika Anda menjalankan kueri SQL langsung hapus dari pengguna di mana id = 1;.
Metode 2. Hapus catatan secara manual melalui fasih
Jika Anda tidak memiliki penghapusan berjenjang di tingkat database, Anda perlu menghapus semuanya secara manual. Jadi jika Anda punya, misalnya, Pengontrol Pengguna Dan menghancurkan() metode, daftarkan semua kalimat hapus terkait satu per satu, dari yang terdalam.
Katakanlah, pengguna memiliki postingan, dan postingan memiliki komentar. Jadi, Anda akan melakukan sesuatu seperti ini:
public function destroy(User $user)
{
$posts = Post::where('user_id', $user->id)->pluck('id');
Comment::whereIn('post_id', $posts)->delete();
Post::where('user_id', $user->id)->delete();
$user->delete();
}
Sekarang, berhati-hatilah dengan kalimat penghapusan berantai tersebut. Salah satu dari mereka mungkin gagal, karena alasan penting lainnya.
Di sini, yang saya sarankan adalah menggunakan transaksi database. Sebab bagaimana jika beberapa permintaan penghapusan gagal, dan permintaan penghapusan sebelumnya tidak dapat dipulihkan lagi?
Jadi inilah kode sebenarnya:
public function destroy(User $user)
{
$posts = Post::where('user_id', $user->id)->pluck('id');
\DB::transaction(function () use ($posts, $user) {
\DB::table('comments')->whereIn('post_id', $posts)->delete();
\DB::table('posts')->where('user_id', $user->id)->delete();
\DB::table('users')->where('id', $user->id)->delete();
});
}
Jadi, ini dia. Tiga cara untuk menghapus pengguna dengan datanya. Mana yang relevan dengan proyek Anda?
News
Berita
News Flash
Blog
Technology
Sports
Sport
Football
Tips
Finance
Berita Terkini
Berita Terbaru
Berita Kekinian
News
Berita Terkini
Olahraga
Pasang Internet Myrepublic
Jasa Import China
Jasa Import Door to Door
Gaming center adalah sebuah tempat atau fasilitas yang menyediakan berbagai perangkat dan layanan untuk bermain video game, baik di PC, konsol, maupun mesin arcade. Gaming center ini bisa dikunjungi oleh siapa saja yang ingin bermain game secara individu atau bersama teman-teman. Beberapa gaming center juga sering digunakan sebagai lokasi turnamen game atau esports.
Comments are closed, but trackbacks and pingbacks are open.