panel:user
Membuat account yang dapat digunakan untuk sign in ke Panel.
Gunakan command ini:
- segera setelah instalasi ketika Panel, routes, dan Login Page sudah tersedia tetapi belum ada user;
- atau kapan pun Anda perlu memberikan access tanpa menyediakan public Registration Form.
php artisan panel:userContoh interactive output:
┌ Name ────────────────────────────────────────────────┐
│ Ada Lovelace │
└──────────────────────────────────────────────────────┘
┌ Email address ───────────────────────────────────────┐
│ ada@example.com │
└──────────────────────────────────────────────────────┘
┌ Password ────────────────────────────────────────────┐
│ •••••••••••• │
└──────────────────────────────────────────────────────┘
INFO Created Ada Lovelace <ada@example.com>.
INFO They can sign into the Admin panel at admin.2
3
4
5
6
7
8
9
10
11
12
Command ini menghilangkan kebutuhan membuka tinker lalu menebak sendiri cara membuat first user dan column apa yang digunakan model application.
Signature
panel:user
{--name= : The account name}
{--email= : The email address to sign in with}
{--password= : The password, prompted for when omitted}
{--guard= : The auth guard whose user model to create, defaults to the application default}
{--panel= : Report whether the new account can reach this panel}2
3
4
5
6
| Option | Default | Efek |
|---|---|---|
--name= | prompt | Ditulis ke name. Required, maksimal 255 karakter. |
--email= | prompt | Ditulis ke email. Required, harus valid email, maksimal 255 karakter. |
--password= | hidden prompt | Di-hash dengan Hash::make(). Required, minimal 8 karakter. |
--guard= | auth.defaults.guard | Menentukan User Model dari guard mana yang diinstansiasi. |
--panel= | Panel pertama berdasarkan id | Panel id yang dipakai untuk access report. Hanya report, tidak pernah membatalkan create. |
Tidak ada:
--force
--update2
Command selalu membuat row baru. Existing email akan menghasilkan database error dan dilaporkan apa adanya.
Non-Interactive
Setiap prompt memiliki option sehingga command dapat digunakan di CI/provisioning:
php artisan panel:user \
--name="Ada Lovelace" \
--email=ada@example.com \
--password="a-long-password" \
--panel=admin \
--no-interaction2
3
4
5
6
Pada non-interactive run, missing value tidak menyebabkan command menunggu input yang tidak akan pernah datang.
Missing value dianggap empty string lalu validation menjelaskan yang kurang:
ERROR The name field is required.
ERROR The email field is required.2
Model yang Dibuat
Model diambil dari auth guard configuration:
$guard = $this->option('guard') ?? config('auth.defaults.guard', 'web');
$provider = config("auth.guards.{$guard}.provider");
$model = config("auth.providers.{$provider}.model");2
3
Dengan demikian project yang memiliki:
App\Models\Admindi balik secondary guard akan membuat Admin, bukan hard-coded App\Models\User.
Contoh:
php artisan panel:user --guard=adminDua failure penting dilaporkan secara eksplisit:
ERROR No auth guard named [staff].
ERROR The [users] user provider names no model this command can create.2
Framework tidak menebak fallback model karena itu berisiko membuat row pada table yang salah.
Data yang Ditulis
$user->forceFill([
'name' => $attributes['name'],
'email' => $attributes['email'],
'password' => Hash::make($attributes['password']),
'email_verified_at' => now(),
])->save();2
3
4
5
6
Empat column ditulis:
name
email
password
email_verified_at2
3
4
email_verified_at sengaja diisi karena account yang dibuat dari console secara definisi telah diverifikasi oleh operator yang memiliki akses ke environment/database.
Jika null, user dapat langsung masuk ke verify-email wall.
forceFill() digunakan, bukan create(), agar model dengan $fillable ketat tetap dapat digunakan oleh provisioning command.
Data lain yang dibutuhkan schema Anda tidak otomatis ditulis, misalnya:
tenant_id
role
is_admin2
3
Jika table memiliki NOT NULL column tanpa default, insert dapat gagal:
ERROR The user could not be created: SQLSTATE[23000]: Integrity constraint violation…Validation
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255'],
'password' => ['required', 'string', 'min:8'],2
3
Password validation sengaja tidak menggunakan:
Password::defaults()Ini adalah console command untuk operator database, bukan public sign-up. Public Registration policy tetap independen.
Uniqueness tidak divalidasi di level command. Duplicate email dibiarkan ditolak database dan exception dilaporkan.
Access Report
Setelah account berhasil dibuat, command melaporkan apakah user benar-benar dapat masuk:
INFO They can sign into the Admin panel at admin.Jika User Model menolak:
WARN They cannot reach the Admin panel yet — your user model's canAccessPanel() says no.
Set whatever that rule reads before signing in.2
Jika Panel menolak:
WARN They cannot reach the Admin panel yet — the panel's own canAccess() says no.
Set whatever that rule reads before signing in.2
Dua independent rule harus sama-sama mengizinkan:
| Rule | Lokasi | Signature |
|---|---|---|
| Panel rule | Panel Provider | Panel::canAccess(Closure $callback): self |
| User rule | User Model yang mengimplementasikan PanelUser | canAccessPanel(Panel $panel): bool |
Command memanggil:
Panel::isAccessibleTo(?Authenticatable $user): boolUser Model tanpa PanelUser tidak ditolak oleh contract tersebut.
Access check hanya report.
Account tetap dibuat walaupun belum memenuhi kondisi, misalnya is_admin belum diaktifkan.
Panel yang Diperiksa
php artisan panel:user --panel=admin
php artisan panel:user2
Dengan --panel=admin, Panel tersebut diperiksa.
Tanpa option, command menggunakan Panel pertama berdasarkan sorted panel id, bukan urutan provider pada config.
PanelManager::all() mengurutkan berdasarkan id.
Behavior ini sama dengan landing logic setelah bare sign-in: first accessible Panel diambil dari daftar tersebut.
Unknown --panel tidak membuat command gagal. Account tetap dibuat dan access report dilewati.
Option menggunakan Panel id, bukan path atau display name.
AdminPanelProvider
→ id: admin2
Exit Codes
| Hasil | Code |
|---|---|
| User berhasil dibuat | 0 |
| Validation gagal | 1 |
| Guard/model tidak dapat di-resolve | 1 |
| Insert melempar exception | 1 |
Access warning tidak mengubah exit code.
Hal yang Perlu Diperhatikan
- Command tidak meng-update existing user. Email yang sama akan menabrak unique index.
--passwordterlihat di shell history dan process list. Pada shared machine, lebih aman gunakan interactive hidden prompt.- Hanya empat column ditulis. Jika schema membutuhkan column tambahan, gunakan seeder atau database default.
- Two-factor dan Email Code tetap berlaku. Command membuat account, bukan bypass security.
--paneladalah Panel id, bukan path/name. Ketiganya dapat berbeda.- Tidak ada data ditulis jika validation gagal. Semua input dikumpulkan dan divalidasi sebelum model disentuh.