Modelable interfaces
Introduction
qore-admin-base uses two contracts to decouple internal logic from concrete Eloquent models:
| Contract | Default model | Config key | Guard |
|---|---|---|---|
Userable | App\Models\User | qore.platform_user | web |
QoreUserable | QoreUser | qore.admin_user | qore |
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
- Create your model and implement the contract:
use Illuminate\Foundation\Auth\User as Authenticatable;
use QoreWorksBusiness\QoreAdminBase\Contracts\Userable;
class User extends Authenticatable implements Userable
{
// ...
}- Point the config to your model:
// 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:
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:
// config/qore.php
'admin_user' => App\Models\AdminUser::class,The package will now use your model in:
QoreUserResource(getModel())QoreUserAuthenticationrelation (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
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:
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. Usenew (resolve(QoreUserable::class))()orapp()->make(...)when you need an instance.