tutorial programming technical tools Jun 14, 2022
Create a command line to make a user admin in Laravel 9
Being able to create your own command lines can be very useful is certain situations.
In this very precise situation, we are about to deploy on production an app with some Users. We have set a role to a user that is either “user” or “admin” and as it is set by default as “user”. (When a user is created it is automatically a normal user).
When you deploy it to production, you might run into the problem that no user are admin and your backend system might be inaccessible 😑.
An easy solution for this would be to create a command line where you can just enter the email of the user you want to make admin and poof!. Let’s tackle that together.
Let’s start from the beginning, and let’s add a role to our user model.
run this into your terminal: php artisan make:migration AddRoleToUsers
This command will generate our migration, we just need to change some bits. Mostly to make sure the role is set to “user” by default.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('institutions', function (Blueprint $table) {
$table->string('status')->default('active');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('institutions', function (Blueprint $table) {
$table->dropColumn('status');
});
}
};
Don’t forget to run your migration with php artisan migrate
Here’s the bit you’re been scrolling for ! How to create a command line
Simply run php artisan make:command MakeAdmin
in your terminal. Doing this will create a file called MakeAdmin.php into your app/console/command directory.
There is a few interesting things to note in this file :
the protected $signature
is where you decide the command you would like to use in the console, and you can pass an argument to it. In this case, we are going to pass the email address of the user (you can use an other field if you would like). It will look like this :
protected $signature = 'make:admin {UserEmail}';
the next interesting line is the protected $description
This will give a description to your command line and be accessible when using php artisan list
.
Use something simple like this : protected $description = 'Make A User Admin';
Still in MakeAdmin.php, you will see a handle method. This is where you want to implement your behaviour.
Here we want to find the user that matches the email and change his role to “admin”
public function handle()
{
$user_email = $this->argument('UserEmail');
User::where('email', $user_email)
->update([
'role' => 'admin'
]);
echo "Finished";
}
Now go in your console and type php artisan admin:make user@example.com
The console will give you a “Finished” as a reward and you should be good to go !
🤯 So simple, right ?
BONUS : If you are using Nova as your backend go into app/Providers/NovaServiceProvider.php and change the access permission by using :
protected function gate()
{
Gate::define('viewNova', function ($user) {
return $user->role == 'admin';
});
}
This will block the access to your nova backend to non-admin users.
Hope this was useful !
Photo by Ben Griffiths on Unsplash