Command panel:user
Command:
php artisan panel:usermembuat account yang dapat digunakan untuk login ke Panel menggunakan User Model dari auth guard yang dipilih.
Setelah account dibuat, command juga melaporkan apakah account tersebut benar-benar diizinkan memasuki Panel.
Command ini sangat berguna pada:
- fresh installation;
- initial administrator setup;
- provisioning script;
- environment yang sudah memiliki Panel tetapi belum memiliki user.
Contoh Minimal
php artisan panel:userInteractive prompt:
Name:
> Ada Lovelace
Email address:
> ada@example.com
Password:
> ********
INFO Created Ada Lovelace <ada@example.com>.
INFO They can sign into the Administrator panel at admin.2
3
4
5
6
7
8
9
10
11
12
Semua value juga dapat diberikan melalui option:
php artisan panel:user \
--name=Ada \
--email=ada@example.com \
--password=correct-horse-battery2
3
4
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 | Validation |
|---|---|---|
--name | prompt | required, string, max:255 |
--email | prompt | required, string, email, max:255 |
--password | hidden prompt | required, string, min:8 |
--guard | auth.defaults.guard | Harus menunjuk guard yang memiliki provider |
--panel | Panel pertama yang diregistrasikan | Hanya digunakan untuk report |
Exit code:
0jika sukses.
1jika validation, guard, atau model gagal.
Handler:
public function handle(
PandaPanel\Core\PanelManager $manager
): int;2
3
Password validation sengaja tidak menggunakan:
Password::defaults()Command ini dijalankan oleh operator yang memiliki database access, bukan public registration.
Registration form tetap menggunakan password policy application.
Model yang Dibuat
Command tidak hard-code:
App\Models\UserModel ditentukan melalui auth config:
--guard
atau
auth.defaults.guard
↓
auth.guards.{guard}.provider
↓
auth.providers.{provider}.model2
3
4
5
6
7
Contoh:
php artisan panel:user \
--guard=admin \
--panel=admin2
3
Jika guard admin menggunakan:
App\Models\Adminmaka model tersebut yang dibuat.
Ini mencegah command membuat record di table yang salah.
Failure Guard/Provider
Dua kemungkinan error utama:
| Pesan | Penyebab |
|---|---|
No auth guard named [x]. | Guard tidak tersedia/tidak memiliki provider valid |
The [users] user provider names no model this command can create. | Provider tidak memiliki model class yang dapat dibuat |
Keduanya exit dengan code:
1Data yang Ditulis
$user =
new $model;
$user->forceFill([
'name' =>
$attributes['name'],
'email' =>
$attributes['email'],
'password' =>
Hash::make(
$attributes['password']
),
'email_verified_at' =>
now(),
])->save();2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
forceFill() digunakan karena command tidak mengetahui $fillable milik host application.
Hash::make() digunakan secara eksplisit agar command tidak bergantung pada hashed cast.
email_verified_at langsung diisi karena account console dianggap sudah diverifikasi oleh operator yang menjalankan command.
Jika dibiarkan null, initial administrator dapat langsung tertahan oleh:
verified middlewareJika database menolak insert, misalnya:
- unique email;
- extra NOT NULL column;
exception ditangkap dan database message ditampilkan:
ERROR The user could not be created: SQLSTATE[23000]...Access Report
Setelah account berhasil dibuat:
$panel
->isAccessibleTo(
$user
);2
3
4
dipanggil.
Dua rule harus sama-sama mengizinkan:
Panel::canAccess()
+
PanelUser::canAccessPanel()2
3
Output sukses:
INFO They can sign into the Administrator panel at admin.Jika Panel rule menolak:
WARN They cannot reach the Administrator panel yet —
the panel's own canAccess() says no.2
Jika User Model menolak:
WARN They cannot reach the Administrator panel yet —
your user model's canAccessPanel() says no.2
Command hanya melaporkan, bukan membatalkan pembuatan account.
Account yang belum memiliki:
is_admin = truemisalnya masih merupakan valid intermediate state.
Promosi dapat dilakukan eksplisit:
use App\Models\User;
User::query()
->where(
'email',
'ada@example.com'
)
->firstOrFail()
->forceFill([
'is_admin' => true,
])
->save();2
3
4
5
6
7
8
9
10
11
12
Panel yang Diperiksa
php artisan panel:user --panel=adminTanpa --panel, command menggunakan Panel pertama yang diregistrasikan berdasarkan urutan:
config(
'panda-panel.panels'
)2
3
Panel id biasanya berasal dari provider basename:
AdminPanelProvider
→ admin
CustomerPortalPanelProvider
→ customer-portal2
3
4
5
kecuali provider menentukan id secara eksplisit.
Perlu diperhatikan: --panel yang salah saat ini tidak menghasilkan error.
Contoh:
--panel=admnaccount tetap dibuat, tetapi tidak ada access report.
Application tanpa Panel terdaftar juga memiliki behavior serupa.
Non-Interactive Run
Jika tidak ada interactive terminal, command tidak menunggu prompt.
Missing input menjadi empty string kemudian validation menjelaskan option yang hilang.
php artisan panel:user --no-interactionOutput:
ERROR The name field is required.
ERROR The email field is required.
ERROR The password field is required.2
3
Provisioning/CI harus memberikan semua required values:
php artisan panel:user \
--name="$ADMIN_NAME" \
--email="$ADMIN_EMAIL" \
--password="$ADMIN_PASSWORD" \
--panel=admin \
--no-interaction2
3
4
5
6
Interactive mode menggunakan Laravel Prompts.
Password prompt tidak di-echo.
Hubungan dengan panel:install
Pada akhir:
php artisan panel:installinstaller dapat menawarkan pembuatan initial user.
Installer pada akhirnya memanggil command yang sama dengan:
--panel={panel}Jadi menjalankan:
php artisan panel:user --panel=adminsecara manual setelah instalasi menghasilkan behavior yang sama.
Testing
it(
'creates a user through the guard own model',
function (): void {
$this
->artisan(
'panel:user',
[
'--name' =>
'Ada Lovelace',
'--email' =>
'ada@example.com',
'--password' =>
'correct-horse-battery',
'--panel' =>
'admin',
]
)
->assertSuccessful();
expect(
User::query()
->where(
'email',
'ada@example.com'
)
->exists()
)->toBeTrue();
}
);2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Unknown guard:
$this
->artisan(
'panel:user',
[
'--guard' =>
'nope',
]
)
->assertFailed();2
3
4
5
6
7
8
9
Hal yang Perlu Diperhatikan
--password=dapat masuk shell history dan process list. Gunakan hidden prompt atau environment variable pada shared machine.- Command hanya create, tidak update.
- Tidak ada
--forceuntuk overwrite existing user. - Access report bukan authorization gate saat create.
- Typo
--paneltidak menghasilkan error/report. - Hanya empat attribute yang ditulis.
- Extra NOT NULL column tanpa default dapat membuat save gagal.
- Panel
canAccess()dipanggil dari console, sehingga callback jangan bergantung padarequest()->route().