Kod lengkap projek Laravel kali ini InsyaAllah dah siap dan boleh muat-turun dari  GITHUB – https://github.com/khirulnizam/lara_acl  , cuma tutorial masih dalam proses pembangunan. Tuan/puan sila bookmark dulu, kami akan umumkan bila sudah siap. Templet Bootstrap untuk admin dasboard/panel diubahsuai dari SB-ADMIN. Telah disediakan templet SB-ADMIN dalam layouts dan juga bootstrap framework dalam public/sbadmin

Rangka tutorial

  1. Controller menambah admin baharu
  2. Antaramuka tambah admin baharu
  3. Database migration
  4. Controller store new admin
  5. Antaramuka kemaskini maklumat admin (update/delete)

Into projek tutorial ACL Laravel

Tutorial kali ini cuba menerangkan dalam bentuk proof-of-concept bagaimana nak implement beberapa peranan pengguna (user-role) dalam Laravel. Dalam contoh sebelum ini, pengguna ada dua kategori; guest & admin. Guest tidak perlu login untuk melihat maklumat awam (public). Tetapi untuk menambah rekod, kemaskini atau padam rekod perlu pengguna yang sah yang mesti melalui proses login.

Bagaimana kalau kita ada peranan pengguna yang lain contohnya peserta boleh mendaftar kursus, mengedit user-profile atau membatalkan kursus yang telah ditdaftar?

Senarai peranan pengguna (user-roles)

  1. Tetamu (guest) – boleh memaparkan maklumat umum contohnya carian semua kursus.
  2. Peserta (participant) – perlu daftar, login dan boleh daftar kursus. Boleh juga melihat kembali senarai kursus yang telah didaftar, batal penyertaan, memperbaharui maklumat profile.
  3. Penyelenggara (admin) – hanya didaftarkan oleh admin yang lain, perlu login untuk menyelenggara senarai kursus dan penyertaan. Boleh buat carian, kemaskini rekod training, padam rekod training, senaraikan penyertaan peserta.

 

Model Training dan migrations

Model Training beserta migration file boleh dicipta dengan arahan berikut;

php artisan make:model Training -m

Selepas laksanakan arahan di atas, buka dalam folder database/migrations/create_trainings_table dan tambah arahan berikut dalam function up();

 

    public function up()
    {
        Schema::create('trainings', function (Blueprint $table) {
            $table->increments('id');
			$table->string('trainingname');
			$table->string('desc');
			$table->string('trainer');
            $table->timestamps();
        });
    }

 

 

Model User dan migrations

Model beserta migration file telah tersedia untuk table users. Biasanya cuma perlu make:auth untuk implement Auth::user facilities.

php artisan make:auth

Model Role dan migrations

Konsep/carta rekabentuk database Role seperti di bawah. Kita cuma akan hasilkan dua roles, iaitu ‘admin’ dan ‘participant’. Sekiranya anda perlukan multiple user-roles sila google ‘permission’.

User hasRole relationship in Laravel visualised

User hasRole relationship in Laravel visualised

php artisan make:model Role -m

Selepas laksanakan arahan di atas, buka dalam folder database/migrations/create_roles_table dan tambah arahan berikut dalam function up();

 

    public function up()
    {
        Schema::create('roles', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('description');
            $table->timestamps();
        });
    }

 

 

Oleh kerana hubungan (relationship) antara pengguna dan peranan adalah many-to-many, makanya kita perlukan satu table tambahan penghubung roles dengan users.

Untuk mencipta migration file laksanakan arahan di bawah;

php artisan make:migration creata_role_user_table

Buka fail yang terhasil dalam database/migration/create_role_user_table dan tambah kod baris berikut;

 

public function up()
{
  Schema::create(‘role_user’, function (Blueprint $table) {
    $table->increments(‘id’);
    $table->integer(‘role_id’)->unsigned();
    $table->integer(‘user_id’)->unsigned();
    $table->timestamps();
  });
}

 

 

Untuk menetapkan hubungan many-to-many antara User dan Role , dalam User model tambahkan function roles( ) dan sediakan kod seperti di bawah;

    public function roles()
    {
        return $this->belongsToMany(Role::class);
        //file location app/User.php
    }

Manakala dalam Role model, tambahkan function user( ) pula;

public function users()
    {
        return $this->belongsToMany(User::class);
        //file location app/Role.php
    }

 

Seeder untuk sediakan data cubaan table users & roles

php artisan make:seeder RoleTableSeeder
php artisan make:seeder UserTableSeeder

 

Untuk menghasilkan dummy data, tambah dalam fail database/seeds/UserTableSeeder.php;

public function run()
    {
        //
        $role_admin = Role::where('name', 'admin')->first();
        $role_participant  = Role::where('name', 'participant')->first();
        //add admin user

        $admin = new User();
        $admin->name = 'Admin Name';
        $admin->email = 'admin@example.com';
        $admin->password = bcrypt('secret');
        $admin->save();
        $admin->roles()->attach($role_admin);

        $admin = new User();
        $admin->name = 'Khirulnizam Abd Rahman';
        $admin->email = 'kerul@gmail.com';
        $admin->password = bcrypt('abc123');
        $admin->save();
        $admin->roles()->attach($role_admin);

        //add participant users
        $participant = new User();
        $participant->name = 'Participant Name';
        $participant->email = 'participant@example.com';
        $participant->password = bcrypt('secret');
        $participant->save();
        $participant->roles()->attach($role_participant);

        $participant = new User();
        $participant->name = 'Shaqirin';
        $participant->email = 'shaq@gmail.com';
        $participant->password = bcrypt('shaq123');
        $participant->save();
        $participant->roles()->attach($role_participant);

        $participant = new User();
        $participant->name = 'Azroy';
        $participant->email = 'azroy@gmail.com';
        $participant->password = bcrypt('azroy123');
        $participant->save();
        $participant->roles()->attach($role_participant);

    }

 

Dalam fail database/seeds/RoleTableSeeder.php;

public function run()
    {
        //
        $role_employee = new Role();
        $role_employee->name = 'admin';
        $role_employee->description = 'Admin User';
        $role_employee->save();

        $role_manager = new Role();
        $role_manager->name = 'participant';
        $role_manager->description = 'Participant User';
        $role_manager->save();
    }

 

Dalam fail database/seeds/TrainingTableSeeder.php;

public function run()
    {
        // $this->call(UsersTableSeeder::class);
		DB::table('trainings')->insert([
            'trainingname' => 'Laravel 101',
            'desc' => 'Web development using PHP framework Laravel',
            'trainer' => 'Khirulnizam Abd Rahman',
            'filename' => 'sig-fstm.png',
        ]);

        DB::table('trainings')->insert([
            'trainingname' => 'Android SQLite',
            'desc' => 'Android Studio apps development with local database using SQLite',
            'trainer' => 'Khirulnizam Abd Rahman',
            'filename' => 'android-sqlite.png',
        ]);

        DB::table('trainings')->insert([
            'trainingname' => 'Video Editing Filmora',
            'desc' => 'An easy video editing using Filmora editor ',
            'trainer' => 'Muizz Salleh',
            'filename' => 'muiz-filmora.png',
        ]);

    }

 

Dalam fail database/seeds/DatabaseSeeder.php

public function run()
    {
        // Role comes before User seeder here.
        $this->call(RoleTableSeeder::class);
        // User seeder will use the roles above created.
        $this->call(UserTableSeeder::class);
        // Training seeder dummy data
        $this->call(TrainingTableSeeder::class);

    }

 

Seterusnya dalam model app/User.php , tambahkan tiga fungsi-fungsi berikut;

public function authorizeRoles($roles)
    {
        if (is_array($roles)) {
            return $this->hasAnyRole($roles) ||
                abort(401, 'This action is unauthorized.');
        }
        return $this->hasRole($roles) ||
            abort(401, 'This action is unauthorized.');
    }
    /**
     * Check multiple roles
     * @param array $roles
     */

public function hasAnyRole($roles)
    {
        return null !== $this->roles()->whereIn('name', $roles)->first();
    }
    /**
     * Check one role
     * @param string $role
     */

public function hasRole($role)
    {
        return null !== $this->roles()->where('name', $role)->first();
    }

 

Percubaan login sebagai admin / participant

Berdasarkan UserTableSeeder di atas, terdapat pengguna yang diberikan role ‘admin’ dan ‘participant’. Cuba paparkan skrin login dan cuba kedua-dua peranan penngguna berikut. Perhatikan bahawa kedua-dua peranan user mendapat skrin panel pengguna yang berbeza.

Admin username: admin@example.com; dengan password secret. 

User admin login, paparan skrin admin panel

User admin login, paparan skrin admin panel

Participant username: participant@example.com; dengan password secret.

User participant login, paparan skrin participant panel

User participant login, paparan skrin participant panel

 

Perbezaan paparan ini boleh dilakukan dengan menujukan kepada skrin yang berbeza apabila jenis peranan berbeza login masuk sistem. Ini boleh dilakukan dalam app/HomeController.php

public function index(Request $request)
    {
        if (Auth::user()->hasRole('admin')){
            $trainings = Training::all()->toArray();
            return view('home', compact('trainings'));
        }
        else if(Auth::user()->hasRole('participant')){
            return view('homeparticipant');
        }
    }

Apabila peranan pengguna adalah ‘admin’ (hasRole), HomeController akan redirect ke resources/views/home.blade.php , manakala sebaliknya apabile peranan pengguna (hasRole) adalah ‘participant’- maka akan dipaparkan pula resources/views/homeparticipant.blade.php

 

resources/views/homeparticipant.blade.php

@extends('layouts.sbadmin')
@section('content')

<div class="container">
    
<div class="row justify-content-center">
        
<div class="col-md-10">
            
<div class="card">
                
<div class="card-header">Participant Panel</div>


                
<div class="card-body">
                    @if (session('status'))
                        
<div class="alert alert-success">
                            {{ session('status') }}
                        </div>

                    @endif

                    

Hello participant {{ Auth::user()->name }} 

                        
					<a href="{{ url('trainings') }}"> Training list</a>

					
                </div>

            </div>

        </div>

    </div>

</div>

@endsection

 

resources/views/home.blade.php

@extends('layouts.sbadmin')
@section('content')

<div class="container">
    
<div class="row justify-content-center">
        
<div class="col-md-10">
            
<div class="card">
                
<div class="card-header">Dashboard</div>


                
<div class="card-body">
                    @if (session('status'))
                        
<div class="alert alert-success">
                            {{ session('status') }}
                        </div>

                    @endif

                    

Hello administrator {{ Auth::user()->name }} 

                        
					<a href="{{ url('trainings') }}"> Training menus</a>
					
					<a href="{{ url('trainings/create') }}">&nbsp;&nbsp; :: Create Training</a>
					
						
						
						<a href="{{ url('admins') }}"> Administrator menus</a>
						
						<a href="{{ url('admins/create') }}">&nbsp;&nbsp; :: Create New Admins</a>
						
					
					
					<a href="#"> Registrations Report</a>
					Choose trainings
					
<form method="GET" action="{{url('registerreports')}}" class="form-inline">
					@csrf
						<select name="id" class="form-control">
							@foreach($trainings as $training)
<option value="{{$training['id']}}"> 
							{{$training['trainingname']}} </option>
							@endforeach
						</select>
						
						<button type="submit" class="btn btn-info"> 
						Generate </button>
					</form>


                </div>

            </div>

        </div>

    </div>

</div>

@endsection

 

Kod lengkap projek Laravel kali ini InsyaAllah dah siap dan boleh muat-turun dari  GITHUB – https://github.com/khirulnizam/lara_acl  

Selamat mencuba dan berjaya!
Rujukan: https://medium.com/@ezp127/laravel-5-4-native-user-authentication-role-authorization-3dbae4049c8a


Modul Laravel bahasa Melayu

 


Trainer:
KHIRULNIZAM ABD RAHMAN, Pensyarah Jabatan Sains Komputer, FSTM KUIS.

Beliau merupakan seorang trainer dalam bidang pengaturcaraan server dan antaramuka web (web front-end & backend) semenjak tahun 2000. Disamping itu juga amat berminat dalam pembangunan applikasi mobile Android, JSON, LARAVEL dan PHP-MySQL.

Antara kursus yang beliau kendalikan;

  1. Android Studio
  2. Pembangunan Web dengan PHP&MySQL
  3. Pembangunan Sistem Web menggunakan kerangka Laravel

Blog peribadi beliau di khirulnizam.com . Beliau boleh dihubungi melalui email khirulnizam@gmail.com , atau Whatsapp: http://wasap.my/60129034614