Extending | laravel-permission | Spatie

 SPATIE

  Laravel Permission
=====================

spatie.be/open-source

  [Docs](https://spatie.be/docs)  [Laravel-permission](https://spatie.be/docs/laravel-permission/v3)  Advanced-usage  Extending

 Version   v7   v6   v5   v4   v3

 Other versions for crawler [v7](https://spatie.be/docs/laravel-permission/v7) [v6](https://spatie.be/docs/laravel-permission/v6) [v5](https://spatie.be/docs/laravel-permission/v5) [v4](https://spatie.be/docs/laravel-permission/v4) [v3](https://spatie.be/docs/laravel-permission/v3)

  Extending
- [ Introduction ](https://spatie.be/docs/laravel-permission/v3/introduction)
- [ Support us ](https://spatie.be/docs/laravel-permission/v3/support-us)
- [ Prerequisites ](https://spatie.be/docs/laravel-permission/v3/prerequisites)
- [ Installation in Laravel ](https://spatie.be/docs/laravel-permission/v3/installation-laravel)
- [ Installation in Lumen ](https://spatie.be/docs/laravel-permission/v3/installation-lumen)
- [ Upgrading ](https://spatie.be/docs/laravel-permission/v3/upgrading)
- [ Questions and issues ](https://spatie.be/docs/laravel-permission/v3/questions-issues)
- [ Changelog ](https://spatie.be/docs/laravel-permission/v3/changelog)
- [ About us ](https://spatie.be/docs/laravel-permission/v3/about-us)

Basic Usage
-----------

- [ Basic Usage ](https://spatie.be/docs/laravel-permission/v3/basic-usage/basic-usage)
- [ Direct Permissions ](https://spatie.be/docs/laravel-permission/v3/basic-usage/direct-permissions)
- [ Using permissions via roles ](https://spatie.be/docs/laravel-permission/v3/basic-usage/role-permissions)
- [ Wildcard permissions ](https://spatie.be/docs/laravel-permission/v3/basic-usage/wildcard-permissions)
- [ Blade directives ](https://spatie.be/docs/laravel-permission/v3/basic-usage/blade-directives)
- [ Defining a Super-Admin ](https://spatie.be/docs/laravel-permission/v3/basic-usage/super-admin)
- [ Using multiple guards ](https://spatie.be/docs/laravel-permission/v3/basic-usage/multiple-guards)
- [ Using artisan commands ](https://spatie.be/docs/laravel-permission/v3/basic-usage/artisan)
- [ Using a middleware ](https://spatie.be/docs/laravel-permission/v3/basic-usage/middleware)
- [ Example App ](https://spatie.be/docs/laravel-permission/v3/basic-usage/new-app)

Best Practices
--------------

- [ Roles vs Permissions ](https://spatie.be/docs/laravel-permission/v3/best-practices/roles-vs-permissions)
- [ Model Policies ](https://spatie.be/docs/laravel-permission/v3/best-practices/using-policies)
- [ Performance Tips ](https://spatie.be/docs/laravel-permission/v3/best-practices/performance)

Advanced usage
--------------

- [ Testing ](https://spatie.be/docs/laravel-permission/v3/advanced-usage/testing)
- [ Database Seeding ](https://spatie.be/docs/laravel-permission/v3/advanced-usage/seeding)
- [ Exceptions ](https://spatie.be/docs/laravel-permission/v3/advanced-usage/exceptions)
- [ Extending ](https://spatie.be/docs/laravel-permission/v3/advanced-usage/extending)
- [ Cache ](https://spatie.be/docs/laravel-permission/v3/advanced-usage/cache)
- [ UUID ](https://spatie.be/docs/laravel-permission/v3/advanced-usage/uuid)
- [ Extending PhpStorm ](https://spatie.be/docs/laravel-permission/v3/advanced-usage/phpstorm)
- [ Other ](https://spatie.be/docs/laravel-permission/v3/advanced-usage/other)
- [ Timestamps ](https://spatie.be/docs/laravel-permission/v3/advanced-usage/timestamps)
- [ UI Options ](https://spatie.be/docs/laravel-permission/v3/advanced-usage/ui-options)

      You are viewing the documentation for **an older version** of this package. You can check the version you are using with the following command:

 `                                    composer show spatie/laravel-permission                                                                                                                                                                                                                                    `

Extending
=========

###  On this page

1. [ Extending User Models ](#content-extending-user-models)
2. [ Extending Role and Permission Models ](#content-extending-role-and-permission-models)
3. [ Migrations - Adding fields to your models ](#content-migrations---adding-fields-to-your-models)

Extending User Models
-----------------------------------------------------------------------------------------------------------------------

Laravel's authorization features are available in models which implement the `Illuminate\Foundation\Auth\Access\Authorizable` trait.

By default Laravel does this in `\App\User` by extending `Illuminate\Foundation\Auth\User`, in which the trait and `Illuminate\Contracts\Auth\Access\Authorizable` contract are declared.

If you are creating your own User models and wish Authorization features to be available, you need to implement `Illuminate\Contracts\Auth\Access\Authorizable` in one of those ways as well.

#### Child User Models

Due to the nature of polymorphism and Eloquent's hard-coded mapping of model names in the database, setting relationships for child models that inherit permissions of the parent can be difficult (even near impossible depending on app requirements, especially when attempting to do inverse mappings). However, one thing you might consider if you need the child model to never have its own permissions/roles but to only use its parent's permissions/roles, is to [override the `getMorphClass` method on the model](https://github.com/laravel/framework/issues/17830#issuecomment-345619085).

eg: This could be useful, but only if you're willing to give up the child's independence for roles/permissions:

```
    public function getMorphClass()
    {
        return 'users';
    }
```

Extending Role and Permission Models
--------------------------------------------------------------------------------------------------------------------------------------------------------------------

If you are extending or replacing the role/permission models, you will need to specify your new models in this package's `config/permission.php` file.

First be sure that you've published the configuration file (see the Installation instructions), and edit it to update the `models.role` and `models.permission` values to point to your new models.

Note the following requirements when extending/replacing the models:

### Extending

If you need to EXTEND the existing `Role` or `Permission` models note that:

- Your `Role` model needs to extend the `Spatie\Permission\Models\Role` model
- Your `Permission` model needs to extend the `Spatie\Permission\Models\Permission` model
- You need to update `config/permisison.php` to specify your namespaced model

### Replacing

If you need to REPLACE the existing `Role` or `Permission` models you need to keep the following things in mind:

- Your `Role` model needs to implement the `Spatie\Permission\Contracts\Role` contract
- Your `Permission` model needs to implement the `Spatie\Permission\Contracts\Permission` contract
- You need to update `config/permisison.php` to specify your namespaced model

Migrations - Adding fields to your models
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

You can add your own migrations to make changes to the role/permission tables, as you would for adding/changing fields in any other tables in your Laravel project. Following that, you can add any necessary logic for interacting with those fields into your custom/extended Models.

 A good
match?
-------------

### What we do best

- All things Laravel
- Custom frontend components
- Building APIs
- AI-powered features
- Simplifying things
- Clean solutions
- Integrating services

### Not our cup of tea

- WordPress themes
- Cutting corners
- Free mockups to win a job
- "Just execute the briefing"

 In short: we'd like to be a **substantial part** of your project.

 [ Get in touch via email ](mailto:info@spatie.be?subject=A%20good%20match%21&body=Tell%20us%20as%20much%20as%20you%20can%20about%0A-%20your%20online%20project%0A-%20your%20planning%0A-%20your%20budget%0A-%20%E2%80%A6%0A%0AAnything%20that%20helps%20us%20to%20start%20straightforward%21)
