Skip to content

Modelable interfaces

Introduction

qore-admin-base uses two contracts to decouple internal logic from concrete Eloquent models:

ContractDefault modelConfig keyGuard
UserableApp\Models\Userqore.platform_userweb
QoreUserableQoreUserqore.admin_userqore

Everywhere the package needs to reference one of these models — relations, Gate policies, morph map, auth provider config — it calls resolve(Userable::class) or resolve(QoreUserable::class) instead of hardcoding the class name. Swapping the config key is all that is required to use a custom model.

Userable

Represents the platform user (front-end / web guard). Extends Authenticatable.

Default: App\Models\User — already set in config/qore.php.

Replacing the platform user model

  1. Create your model and implement the contract:
php
use Illuminate\Foundation\Auth\User as Authenticatable;
use QoreWorksBusiness\QoreAdminBase\Contracts\Userable;

class User extends Authenticatable implements Userable
{
    // ...
}
  1. Point the config to your model:
php
// config/qore.php
'platform_user' => App\Models\User::class,

The package will now use your model in UserResource, gate policies, morph map (user), and the Route::model('qore_user', ...) binding.

QoreUserable

Represents the admin panel user (qore guard). Extends Authenticatable and also requires the Filament, MFA, auditing, and locale contracts.

Default: QoreWorksBusiness\QoreAdminBase\Models\QoreUser — already set in config/qore.php.

Replacing the admin user model

Extend QoreUser so all existing behaviour is inherited, then implement QoreUserable explicitly if you override any contract methods:

php
use QoreWorksBusiness\QoreAdminBase\Contracts\QoreUserable;
use QoreWorksBusiness\QoreAdminBase\Models\QoreUser;

class AdminUser extends QoreUser implements QoreUserable
{
    // add traits
    
    
    protected static function newFactory(): QoreUserFactory
    {
        return QoreUserFactory::new();
    }
    
    // override or extend as needed
    
    
}

Point the config to your model:

php
// config/qore.php
'admin_user' => App\Models\AdminUser::class,

The package will now use your model in:

  • QoreUserResource (getModel())
  • QoreUserAuthentication relation (user())
  • Gate::policy(...)QoreUserPolicy
  • Morph map key qoreUser
  • Auth provider config (auth.providers.qore.model)

Adding a factory

By default the new model will still be using the existing factory. This will cause issues when resolving morphmaps. Add your own factory, that references you QoreUser model. This factory can extend the existing factory.

php
<?php

declare(strict_types=1);

namespace Database\Factories;

use App\Models\QoreUser;
use Illuminate\Database\Eloquent\Factories\Factory;
use QoreWorksBusiness\QoreAdminBase\Database\Factories\QoreUserFactory as QoreUserFactoryBase;

/**
 * @extends Factory<QoreUser>
 */
class QoreUserFactory extends QoreUserFactoryBase
{
    protected $model = QoreUser::class;
}

Omitting admin_user

If qore.admin_user is not set, the package falls back to QoreUser:

Type-hinting against the contracts

Inject or resolve the contract instead of the concrete class whenever you write code that must remain portable:

php
use QoreWorksBusiness\QoreAdminBase\Contracts\QoreUserable;

$model = resolve(QoreUserable::class); // returns the configured class name string
$user  = app(QoreUserable::class);     // same — use whichever reads better in context

/** @var QoreUserable $user */
$user = QoreUser::find(1);

Note: resolve(QoreUserable::class) returns a class name string, not an instance. Use new (resolve(QoreUserable::class))() or app()->make(...) when you need an instance.