Laravel 8 user roles and permissions tutorial

By Guest | Apr 07, 2022 | Laravel
Share : Whatsapp

https://www.fundaofwebit.com/post/laravel-8-user-roles-and-permissions-tutorial

Laravel 8 user roles and permissions tutorial


In this article, we will be learning how to implement user roles and permissions in Laravel 8. We will use Laravel spatie package to implement roles and permission. This way, it will be easy to implement user roles and permission. 

We will not be using Laravel Form ( laravelcollective/html ) instead we will directly use html. so, Let's get started.


Step 1: Create Laravel 8 Application

composer create-project laravel/laravel:^8.0 laravel-project


Step 2: Setup the Database Connection in .env file.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=


Step 3: Install and configure the Spatie Package:

composer require spatie/laravel-permission

After installing successfully, Now we need to register the provider class to the config/app.php file so open the file and add the service provider.

'providers' => [

    Spatie\Permission\PermissionServiceProvider::class,
]

Now, publish the files with below command:

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"


Step 4: Register package middlewares

The package comes with roles and permission middlewares, we can add them inside app/Http/Kernel.php file.

protected $routeMiddleware = [
    ...
    'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
    'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
    'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,
];


Step 5: Add the HasRoles trait in the User Model in path: app/Models/User.php as shown below with Password bcrypt option:

<?php

namespace App\Models;

use Laravel\Sanctum\HasApiTokens;
use Spatie\Permission\Traits\HasRoles;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable, HasRoles;

...
public function setPasswordAttribute($value)
    {
        $this->attributes['password'] = bcrypt($value);
    }
}


Step 6: Create Authentication Scaffolding with the following command:

composer require laravel/ui

After successful installation of laravel UI package, run the below command to create the scaffolding.

php artisan ui:auth

Let's Migrate the tables into our database with the following command:

php artisan migrate


Step 7: Create Controllers for user, roles and permission with the below command:

php artisan make:controller UserController
php artisan make:controller RoleController
php artisan make:controller PermissionController


Step 8: Let's go to each controller and add the CRUD code in it.

UserController : In the path - app/Http/Controllers/UserController.php  
<?php

namespace App\Http\Controllers;

use DB;
use Hash;
use App\Models\User;
use Illuminate\Support\Arr;
use Illuminate\Http\Request;
use Spatie\Permission\Models\Role;
use App\Http\Controllers\Controller;
use App\Http\Requests\UserFormRequest;

class UserController extends Controller
{
    public function __construct()
    {
        $this->middleware('permission:role.read|role.create|role.edit|role.delete', ['only' => ['index','store']]);
        $this->middleware('permission:role.create', ['only' => ['create','store']]);
        $this->middleware('permission:role.edit', ['only' => ['edit','update']]);
        $this->middleware('permission:role.delete', ['only' => ['destroy']]);
    }

    public function index()
    {
        $users = User::orderBy('id','DESC')->paginate(10);
        return view('users.index',compact('users'));
    }

    public function create()
    {
        $roles = Role::pluck('name','name')->all();
        return view('users.create',compact('roles'));
    }

    public function store(UserFormRequest $request)
    {
        $data = $request->validated();
        try {

            $user = User::create($data);
            $user->assignRole($request->input('roles'));

            return redirect('users')->with('message','User created successfully');

        } catch(\Exception $ex){

            return redirect('users')->with('message','Something Went Wrong  - '.$ex->getMessage());
        }
    }

    public function show(User $user)
    {
        return view('users.show',compact('user'));
    }

    public function edit(User $user)
    {
        $roles = Role::pluck('name','name')->all();
        $userRole = $user->roles->pluck('name','name')->all();
        return view('users.edit',compact('user','roles','userRole'));
    }

    public function update(UserFormRequest $request, $id)
    {
        $data = $request->validated();
        try {

            if(!empty($data['password'])){
                $data['password'] = Hash::make($data['password']);
            }else{
                $data = Arr::except($data,array('password'));
            }

            $user = User::find($id);
            $user->update($data);

            DB::table('model_has_roles')->where('model_id',$id)->delete();
            $user->assignRole($request->input('roles'));

            return redirect('users')->with('message','User updated successfully');

        } catch(\Exception $ex){

            return redirect('users')->with('message','Something Went Wrong - '.$ex->getMessage());
        }
    }

    public function destroy(User $user)
    {
        try {
            $user->delete();
            return redirect('users')->with('message','User Deleted Succeessfully');
        } catch(\Exception $ex){

            return redirect('users')->with('message','Something Went Wrong - '.$ex->getMessage());
        }
    }
}

We have done FormRequest Validation in this UserController.php file, so let's add that also with the below command:  

php artisan make:request UserFormRequest

after creating the form request successfully. Go to the file in path:  app/Http/Requests/UserFormRequest.php and paste the below code:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UserFormRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $rules = [
            'name' => [
                'required',
                'string',
                'max:100',
                'min:3',
            ],
            'roles' => [
                'required',
                'array'
            ]
        ];

         if($this->getMethod() == "POST"){

            $rules += [
                'email' => [
                    'required',
                    'email',
                    'max:100',
                    'min:3',
                    'unique:users,email,NULL,id',
                ],
                'password' => [
                    'required',
                    'confirmed',
                    'max:50',
                    'min:8',
                ]
            ];
        }

        if($this->getMethod() == "PUT"){

            $rules += [
                'email' => [
                    'required',
                    'email',
                    'max:100',
                    'min:3',
                    'unique:users,email,'.$this->user.',id',
                ],
                'password' => [
                    'nullable',
                    'confirmed',
                    'max:50',
                    'min:8',
                ]
            ];
        }

        return $rules;
    }
}


RoleController : In the path - app/Http/Controllers/RoleController.php 
<?php

namespace App\Http\Controllers;

use DB;
use Illuminate\Http\Request;
use Spatie\Permission\Models\Role;
use App\Http\Controllers\Controller;
use Spatie\Permission\Models\Permission;
use App\Http\Requests\RoleFormRequest;

class RoleController extends Controller
{
    public function __construct()
    {
        $this->middleware('permission:role.read|role.create|role.edit|role.delete', ['only' => ['index','store']]);
        $this->middleware('permission:role.create', ['only' => ['create','store']]);
        $this->middleware('permission:role.edit', ['only' => ['edit','update']]);
        $this->middleware('permission:role.delete', ['only' => ['destroy']]);
    }

    public function index()
    {
        $roles = Role::orderBy('id','DESC')->paginate(5);
        return view('roles.index', compact('roles'));
    }

    public function create()
    {
        $permissions = Permission::get();
        return view('roles.create',compact('permissions'));
    }

    public function store(RoleFormRequest $request)
    {
        $data = $request->validated();
        try {

            $role = Role::create(['name' => $data['name']]);
            $role->syncPermissions($request['permission']);
            return redirect('roles')->with('message','Role created successfully');

        } catch(\Exception $ex){

            return redirect('roles')->with('message','Something Went Wrong - '.$ex->getMessage());
        }
    }

    public function show(Role $role)
    {
        $role = Role::find($role->id);
        $rolePermissions = Permission::join("role_has_permissions","role_has_permissions.permission_id","=","permissions.id")
                                ->where("role_has_permissions.role_id",$role->id)
                                ->get();
        return view('roles.show', compact('role','rolePermissions'));
    }

    public function edit(Role $role)
    {
        $role = Role::find($role->id);
        $permission = Permission::get();
        $rolePermissions = DB::table("role_has_permissions")->where("role_has_permissions.role_id",$role->id)
                                ->pluck('role_has_permissions.permission_id','role_has_permissions.permission_id')
                                ->all();

        return view('roles.edit',compact('role','permission','rolePermissions'));
    }

    public function update(RoleFormRequest $request, $id)
    {
        $data = $request->validated();
        try {

            $role = Role::find($id);
            $role->name = $data['name'];
            $role->save();
            $role->syncPermissions($data['permission']);
            return redirect()->route('roles.index')->with('success','Role updated successfully');

        } catch(\Exception $ex){

            return redirect('roles')->with('message','Something Went Wrong - '.$ex->getMessage());
        }
    }

    public function destroy(Role $role)
    {
        try {

            $role->delete();
            return redirect()->route('roles.index')->with('success','Role deleted successfully');
        } catch(\Exception $ex){

            return redirect('roles')->with('message','Something Went Wrong - '.$ex->getMessage());
        }
    }
}

We have done FormRequest Validation in this above RoleController.php file, so let's add that also with the below command:

php artisan make:request RoleFormRequest

after creating the formRequest successfully. Go to the file in path:  app/Http/Requests/RoleFormRequest.php and paste the below code:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class RoleFormRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $rules = [
            'permission' => [
                'required',
            ],
        ];

         if($this->getMethod() == "POST"){

            $rules += [
                'name' => [
                    'required',
                    'string',
                    'max:100',
                    'min:3',
                    'unique:roles,name,NULL,id',
                ],
            ];
        }

        if($this->getMethod() == "PUT"){

            $rules += [
                'name' => [
                    'required',
                    'string',
                    'max:100',
                    'min:3',
                    'unique:roles,name,'.$this->role.',id',
                ],
            ];
        }

        return $rules;
    }
}


PermissionController : In the path - app/Http/Controllers/PermissionController.php 
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Spatie\Permission\Models\Permission;

class PermissionController extends Controller
{
    public function __construct()
    {
         $this->middleware('permission:permission-read|permission-create|permission-edit|permission-delete', ['only' => ['index','store']]);
         $this->middleware('permission:permission-create', ['only' => ['create','store']]);
         $this->middleware('permission:permission-edit', ['only' => ['edit','update']]);
         $this->middleware('permission:permission-delete', ['only' => ['destroy']]);
    }

    public function index()
    {
        $permissions = Permission::orderBy('id','DESC')->paginate(5);
        return view('permissions.index', compact('permissions'));
    }

    public function create()
    {
        return view('permissions.create');
    }

    public function store(Request $request)
    {
        $this->validate($request, [
            'name' => 'required|unique:permissions,name',
        ]);
   
        Permission::create(['name' => $request->input('name')]);
        return redirect()->route('permissions.index')->with('message', 'Permission created successfully.');
    }

    public function show(Permission $permission)
    {
        return view('permissions.show', compact('permission'));
    }

    public function edit(Permission $permission)
    {
        return view('permissions.edit', compact('permission'));
    }

    public function update(Request $request, Permission $permission)
    {
        $this->validate($request, [
            'name' => 'required'
        ]);
   
        $permission->name = $request->input('name');
        $permission->save();
        return redirect()->route('permissions.index')->with('message', 'Permission updated successfully.');
    }

    public function destroy(Permission $permission)
    {
        $permission->delete();
        return redirect()->route('permissions.index')->with('message', 'Permission deleted successfully');
    }
}


Step 9: Create Routes for these Roles and Permission.

Route::resource('users', App\Http\Controllers\UserController::class);
Route::resource('roles', App\Http\Controllers\RoleController::class);
Route::resource('permissions', App\Http\Controllers\PermissionController::class);


Step 10: Let's create the pages (blade files) for Layout, User, Roles, Permission :

In this app.blade.php file we are going to add Bootstrap CDN Link - path: resources/views/layouts/app.blade.php as follows:

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <title>{{ config('app.name', 'Laravel') }}</title>

    ...
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css">

</head>
<body>
    <div id="app">
     
        <main class="py-4">
            @yield('content')
        </main>
    </div>

    ...
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>

</body>
</html>


Let's Create User Files.

First Create a folder named users in the following path - resources/views/users and then create 3 files named indexblade.php, create.blade.php, edit.blade.php.

Go to the path - resources/views/users/index.blade.php and paste the below code

@extends('layouts.app')

@section('content')

<div class="container">

    @if (session('message'))
        <div class="alert alert-success"><p>{{ session('message') }}</p></div>
    @endif

    <div class="row">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header">
                    <h4>Users Management
                        <a href="{{ url('users/create') }}" class="btn btn-primary float-end">Create User</a>
                    </h4>
                </div>
                <div class="card-body">
                    <div class="table-responsive">
                        <table class="table table-bordered table-md">
                            <thead>
                                <tr>
                                    <th>No</th>
                                    <th>Name</th>
                                    <th>Email</th>
                                    <th>Roles</th>
                                    <th width="230px">Action</th>
                                </tr>
                            </thead>
                            <tbody>
                                @php $i=1; @endphp
                                @foreach ($users as $key => $user)
                                <tr>
                                    <td>{{ $i++ }}</td>
                                    <td>{{ $user->name }}</td>
                                    <td>{{ $user->email }}</td>
                                    <td>
                                        @if(!empty($user->getRoleNames()))
                                            @foreach($user->getRoleNames() as $rolename)
                                            <label class="badge badge-success">{{ $rolename }}</label>
                                            @endforeach
                                        @endif
                                    </td>
                                    <td>
                                        @can('role.edit')
                                        <a class="btn btn-primary btn-sm" href="{{ route('users.edit',$user->id) }}">Edit</a>
                                        @endcan
                                        @can('role.delete')
                                            <form action="{{ route('users.destroy',$user->id) }}" method="POST" class="d-inline">
                                                @csrf
                                                @method('DELETE')
                                                <button type="submit" class="btn btn-danger">Delete</button>
                                            </form>
                                        @endcan
                                    </td>
                                </tr>
                                @endforeach
                            </tbody>
                        </table>
                    </div>
                    <div>
                        {!! $users->links() !!}
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

@endsection


Go to the path - resources/views/users/create.blade.php and paste the below code

@extends('layouts.app')

@section('content')

<div class="container">

    @if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
    @endif

    <div class="row">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header">
                    <h4>Create User</h4>
                </div>
                <div class="card-body">
                    <form action="{{ route('users.store') }}" method="POST">
                        @csrf

                        <div class="row">
                            <div class="col-md-6 mb-3">
                                <label>Name</label>
                                <input type="text" name="name" class="form-control" />
                            </div>
                            <div class="col-md-6 mb-3">
                                <label>Email</label>
                                <input type="email" name="email" class="form-control" />
                            </div>
                            <div class="col-md-6 mb-3">
                                <label>Password</label>
                                <input type="password" name="password" class="form-control" />
                            </div>
                            <div class="col-md-6 mb-3">
                                <label>Confirm Password</label>
                                <input type="password" name="password_confirmation" class="form-control" />
                            </div>
                            <div class="col-md-6 mb-3">
                                <strong>Role:</strong>
                                <select name="roles[]" class="form-control" required multiple>
                                    <option>Select Role</option>
                                    @foreach ($roles as $role)
                                    <option value="{{$role}}">{{$role}}</option>
                                    @endforeach
                                </select>
                            </div>
                            <div class="col-md-12 text-end mt-3">
                                <button type="submit" class="btn btn-primary">Submit</button>
                            </div>
                        </div>

                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

@endsection


Go to the path - resources/views/users/edit.blade.php and paste the below code

@extends('layouts.app')

@section('content')

<div class="container">

    @if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
    @endif

    <div class="row">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header">
                    <h4>Edit User</h4>
                </div>
                <div class="card-body">
                  <form action="{{ route('users.update', $user->id) }}" method="POST">
                      @csrf
                      @method('PUT')

                      <div class="row">
                          <div class="col-md-6 mb-3">
                              <label>Name</label>
                              <input type="text" name="name" value="{{ $user->name }}" class="form-control" />
                          </div>
                          <div class="col-md-6 mb-3">
                              <label>Email</label>
                              <input type="email" name="email" value="{{ $user->email }}" class="form-control" />
                          </div>
                          <div class="col-md-6 mb-3">
                              <label>Password</label>
                              <input type="password" name="password" class="form-control" />
                          </div>
                          <div class="col-md-6 mb-3">
                              <label>Confirm Password</label>
                              <input type="password" name="password_confirmation" class="form-control" />
                          </div>
                          <div class="col-md-6 mb-3">
                              <strong>Role:</strong>
                              <select name="roles[]" class="form-control" required multiple>
                                  <option value="">Select Role</option>
                                  @foreach ($roles as $role)
                                      <option value="{{$role}}"{{ in_array($role,$userRole) ? 'selected' : '' }}>{{$role}}</option>
                                  @endforeach
                              </select>
                          </div>
                          <div class="col-md-12 text-end mt-3">
                              <button type="submit" class="btn btn-primary">Update</button>
                          </div>
                      </div>

                  </form>
              </div>
          </div>
        </div>
    </div>
</div>

@endsection


Let's Create Roles Files.

First Create a folder named roles in the following path - resources/views/roles and then create 3 files named indexblade.phpcreate.blade.phpedit.blade.php.

Go to the path - resources/views/roles/index.blade.php and paste the below code:

@extends('layouts.app')

@section('content')

<div class="container">

    @if (session('message'))
    <div class="alert alert-success">
        <p>{{ session('message') }}</p>
    </div>
    @endif

    <div class="row">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header">
                    <h4>Role Management
                        <a class="btn btn-success float-end" href="{{ route('roles.create') }}"> Create New Role</a>
                    </h4>
                </div>
                <div class="card-body">
                    <div class="table-responsive">
                        <table class="table table-bordered table-md">
                            <thead>
                                <tr>
                                    <th>#</th>
                                    <th>Name</th>
                                    <th width="230px">Action</th>
                                </tr>
                            <thead>
                            <tbody>
                                @php $i =1 @endphp
                                @foreach ($roles as $key => $role)
                                <tr>
                                    <td>{{ $i++ }}</td>
                                    <td>{{ $role->name }}</td>
                                    <td>
                                        @can('role.edit')
                                        <a class="btn btn-primary" href="{{ route('roles.edit',$role->id) }}">Edit</a>
                                        @endcan
                                        @can('role.delete')
                                        <form action="{{ route('roles.destroy',$role->id) }}" method="POST"
                                            class="d-inline">
                                            @csrf
                                            @method('DELETE')
                                            <button type="submit" class="btn btn-danger">Delete</button>
                                        </form>
                                        @endcan
                                    </td>
                                </tr>
                                @endforeach
                            </tbody>
                        </table>
                        <div>
                            {!! $roles->links() !!}
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

@endsection


Go to the path - resources/views/roles/create.blade.php and paste the below code:

@extends('layouts.app')

@section('content')

<div class="container">

    @if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
    @endif

    <div class="row">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header">
                    <h4>Create Role</h4>
                </div>
                <div class="card-body">
                    <form action="{{ route('roles.store') }}" method="POST">
                        @csrf

                        <div class="row">
                            <div class="col-md-12 mb-3">
                                <label>Name</label>
                                <input type="text" name="name" class="form-control" />
                            </div>
                            <div class="col-md-12 mb-3">
                                <label>Permission</label>
                                <br />
                                <div class="row">
                                    @foreach($permissions as $permission)
                                    <div class="col-md-3">
                                        <label><input type="checkbox" name="permission[]" value="{{ $permission->id }}"> {{ $permission->name }}</label>
                                    </div>
                                    @endforeach
                                </div>
                            </div>
                            <div class="col-md-12 text-end mt-3">
                                <button type="submit" class="btn btn-primary">Submit</button>
                            </div>
                        </div>

                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

@endsection


Go to the path - resources/views/roles/edit.blade.php and paste the below code:

@extends('layouts.app')

@section('content')

<div class="container">

    @if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
    @endif

    <div class="row">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header">
                    <h4>Edit Role</h4>
                </div>
                <div class="card-body">
                    <form action="{{ route('roles.update',$role->id) }}" method="POST">
                        @csrf
                        @method('PUT')

                        <div class="row">
                            <div class="col-md-12 mb-3">
                                <label>Name</label>
                                <input type="text" name="name" value="{{ $role->name }}" class="form-control" />
                            </div>
                            <div class="col-md-12 mb-3">
                                <label>Permission</label>
                                <br />
                                <div class="row">
                                    @foreach($permission as $value)
                                    <div class="col-md-3">
                                        <label>
                                            <input type="checkbox" name="permission[]" value="{{ $value->id }}"
                                                {{ in_array($value->id, $rolePermissions) ? 'checked' : '' }} >
                                            {{ $value->name }}
                                        </label>
                                    </div>
                                    @endforeach
                                </div>
                            </div>
                            <div class="col-md-12 text-end mt-3">
                                <button type="submit" class="btn btn-primary">Update</button>
                            </div>
                        </div>

                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

@endsection


Let's Create Permissions Files.

First Create a folder named permissions in the following path - resources/views/permissions and then create 3 files named indexblade.phpcreate.blade.phpedit.blade.php.

Go to the path - resources/views/permissions/index.blade.php and paste the below code:

@extends('layouts.app')

@section('content')

<div class="container">

    @if (session('message'))
        <div class="alert alert-success">
            <p>{{ session('message') }}</p>
        </div>
    @endif
    <div class="row">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header">
                    <h4>Permissions
                        <a class="btn btn-danger float-right" href="{{ url('permissions/create') }}">Create Permissions</a>
                    </h4>
                </div>
                <div class="card-body">
                    <div class="table-responsive">
                        <table class="table table-bordered table-md">
                            <thead>
                                <tr>
                                    <th>#</th>
                                    <th>Name</th>
                                    <th width="280px">Action</th>
                                </tr>
                            </thead>
                            <tbody>
                                @foreach($permissions as $key => $permission)
                                <tr>
                                    <td>{{ $permission->id }}</td>
                                    <td>{{ $permission->name }}</td>
                                    <td>
                                        @can('role.edit')
                                        <a class="btn btn-primary" href="{{ route('permissions.edit',$permission->id) }}">Edit</a>
                                        @endcan
                                        @can('role.delete')
                                            <form action="{{ route('permissions.destroy',$permission->id) }}" method="POST" class="d-inline">
                                                @csrf
                                                @method('DELETE')
                                                <button type="submit" class="btn btn-danger">Delete</button>
                                            </form>
                                        @endcan
                                    </td>
                                </tr>
                                @endforeach
                            </tbody>
                        </table>
                    </div>
                    <div>
                        {{ $permissions->links() }}
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

@endsection


Go to the path - resources/views/permissions/create.blade.php and paste the below code:

@extends('layouts.app')

@section('content')

<div class="container">

    @if (count($errors) > 0)
        <div class="alert alert-danger">
            <ul>
                @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif

    <div class="row">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header">
                    <h4>Create Permission</h4>
                </div>
                <div class="card-body">
                    <form action="{{ route('permissions.store') }}" method="POST">
                        @csrf

                        <div class="mb-3">
                            <label>Name</label>
                            <input type="text" name="name" class="form-control" />
                        </div>
                        <div class="mt-3">
                            <button type="submit" class="btn btn-primary">Submit</button>
                        </div>
                       
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

@endsection


Go to the path - resources/views/permissions/edit.blade.php and paste the below code:

@extends('layouts.app')

@section('content')

<div class="container">

    @if (count($errors) > 0)
        <div class="alert alert-danger">
            <ul>
                @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif

    <div class="row">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header">
                    <h4>Edit Permission</h4>
                </div>
                <div class="card-body">
                    <form action="{{ route('permissions.update', $permission->id) }}" method="POST">
                        @csrf
                        @method('PUT')
                       
                        <div class="mb-3">
                            <label>Name</label>
                            <input type="text" name="name" value="{{ $permission->name }}" class="form-control" />
                        </div>
                        <div class="mt-3">
                            <button type="submit" class="btn btn-primary">Submit</button>
                        </div>
                       
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

@endsection


Step 11: Create required Roles and Permission with the help of Laravel Seeder to start with the Project. 

create the seeder with the following command:

php artisan make:seeder CreatePermissionSeeder

After successfully creating the seeder, go to its path - database/seeders/CreatePermissionSeeder.php file and paste the below code

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

use App\Models\User;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

class CreatePermissionSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Permission::create(['name' => 'role.create']);
        Permission::create(['name' => 'role.update']);
        Permission::create(['name' => 'role.delete']);
        Permission::create(['name' => 'role.read']);
        Permission::create(['name' => 'role.edit']);

        Permission::create(['name' => 'permission.create']);
        Permission::create(['name' => 'permission.update']);
        Permission::create(['name' => 'permission.delete']);
        Permission::create(['name' => 'permission.read']);
        Permission::create(['name' => 'permission.edit']);

        // Creating a Super Admin User
        $user = User::create([
            'name' => 'Admin',
            'email' => 'admin@example.com',
            'password' => '12345678'
        ]);

        // Creating a Role
        $role = Role::create(['name' => 'admin']);

        // Getting all the Permission by name
        $permissions = Permission::all()->pluck('name');

        // Giving permission to role
        $role->givePermissionTo($permissions);

        //assigning role to a user
        $user->assignRole([$role->id]);
    }
}


Now, let's run the Seeder with the following command:

php artisan db:seed --class=CreatePermissionSeeder

Serve the application.

php artisan serve


Note: Email : amin@example.com Password: 12345678

That's it guys, start using your roles and permission for each CRUD operation or any other task in the application.