# Membuat Policy di Laravel

<figure><img src="https://3397141630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUQUm1GVUT3pDnRHmDRU%2Fuploads%2FxPG0AN0ucD5K0Yym4vJ7%2FUntitled.png?alt=media&#x26;token=895696e2-d0c3-4681-a3e4-a80c1ad8166c" alt=""><figcaption></figcaption></figure>

Policy adalah privilege (hak istimewa), bisa dibilang juga kalo ada pembatasan hak akses, jadi hanya user-user tertentu saja yang hanya bisa diberi akses untuk masuk. Di Laravel sendiri sudah disediakan fitur itu, yang memudahkan kita sebagai web developer untuk ngoding lebih cepat :D.

Contoh kegunaannya itu semisal user hanya bisa meliat halaman saja sedangkan admin bisa melakukan add, update, dan delete. Kurang lebih gambarannya seperti itu.

**Cara membuat Policy di Laravel**, berikut langkah-langkahnya:

Pastikan sudah menambahkan field role pada migration table `User` seperti ini

```
Schema::create('users', function (Blueprint $table) {
	$table->id();
        $table->string('role');
	$table->rememberToken();
	$table->timestamps();
});
```

Lalu buat `model & controller`

```
php artisan make:model Post -m
```

```
php artisan make:controller PostController --resource
```

Pastikan ada code ini di `App\Providers\AppServiceProvider.php`

```
public function boot()
    {
        Schema::defaultStringLength(191);
    }
```

Silahkan copycat code berikut ke terminal

```
php artisan make:policy PostPolicy --model=Post
```

Disini aku punya model dengan nama *Post*, jadi kurang lebih command nya seperti diatas.

Lalu, akan ada file baru seperti ini, buka file tersebut

<figure><img src="https://3397141630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUQUm1GVUT3pDnRHmDRU%2Fuploads%2FS6VYJ1JmT8mDVXuzg2Ik%2FUntitled%20(1).png?alt=media&#x26;token=441b953a-5d24-4f4b-bdfa-1dc2771e9750" alt=""><figcaption></figcaption></figure>

Selanjutnya copycat code berikut, jika hanya 1 role

```
return $user->role === 'admin';
```

Dan menggunakan array jika lebih dari satu role

```
return in_array($user->role, ['admin', 'user']);
```

<figure><img src="https://3397141630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUQUm1GVUT3pDnRHmDRU%2Fuploads%2F44Q2uL8lliUoUOc9cRlH%2FUntitled%20(2).png?alt=media&#x26;token=b2f30722-61a1-4a4d-8919-c5c37891c4c2" alt=""><figcaption></figcaption></figure>

Kemudian copycat code berikut pada `Controller` dari Policy tersebut

```
$this->authorize('viewAny', Post::class);
```

Setelah itu buat code berikut pada `view` yang akan ditampilkan

```html
@can('viewAny', App\Post::class)
	<button type="button" class="btn btn-primary btn-circle btn-sm" data-toggle="modal" data-target="#modal-detail{{ $d->id }}"><i class="fa fa-eye" aria-hidden="true"></i></button>
	<button type="button" class="btn btn-warning btn-circle btn-sm" data-toggle="modal" data-target="#modal-edit{{ $d->id }}"><i class="fa fa-pen" aria-hidden="true"></i></button>
@endcan
```

Contoh `View` seperti ini

```html
@if (Auth::user()->role_id != 1)
        <h1 class="h3 mb-4 text-gray-800">Maaf, kamu tidak bisa mengakses halaman ini.</h1>
    @else
        @can('view', App\Models\User::class)
            <!-- Begin Page Content -->
            <div class="container-fluid">

                <!-- Page Heading -->
                <h1 class="h3 mb-4 text-gray-800">@yield('title')</h1>

                @include('flash-message')

                <!-- DataTales Example -->
                <div class="card shadow mb-4">
                    @can('create', App\Models\User::class)
                        <div class="card-header py-3">
                            <h6 class="m-0 font-weight-bold text-primary">
                                <a href="{{ route('user.add') }}" class="btn btn-success btn-icon-split">
                                    <span class="icon text-white-50">
                                        <i class="fas fa-plus"></i>
                                    </span>
                                    <span class="text">Add</span>
                                </a>
                            </h6>
                        </div>
                    @endcan

                </div>

            </div>
            <!-- /.container-fluid -->
        @endcan
    @endif
```

Sekian, Gomawo^-^
