Installation:
composer require baks-dev/users-profile-type
php artisan vendor:publish --provider="BaksDev\UsersProfileType\UsersProfileTypeServiceProvider" --tag="migrations"
php artisan migrate
Publish Assets (if needed):
php artisan baks:assets:install
First Use Case:
Define a profile type in config/users-profile-type.php:
'types' => [
'admin' => [
'label' => 'Administrator',
'description' => 'Full access to all features',
'icon' => 'fas fa-user-shield',
],
'editor' => [
'label' => 'Editor',
'description' => 'Can edit content',
'icon' => 'fas fa-edit',
],
],
Assign to User:
use BaksDev\UsersProfileType\Models\UserProfileType;
$user = User::find(1);
$user->profileType()->attach(UserProfileType::where('type', 'admin')->first());
Profile Type Management:
// Create
$profileType = UserProfileType::create(['type' => 'moderator']);
// Fetch
$types = UserProfileType::all();
// Update
$profileType->update(['description' => 'New description']);
// Delete
$profileType->delete();
User Assignment:
// Assign multiple types
$user->profileType()->sync(['admin', 'editor']);
// Check if user has a type
$user->profileType->contains('admin'); // true/false
// Get all assigned types
$user->profileType->pluck('type');
Middleware Integration:
// app/Http/Middleware/CheckProfileType.php
public function handle($request, Closure $next, $type)
{
if (!$request->user()->profileType->contains($type)) {
abort(403, 'Unauthorized action for this profile type.');
}
return $next($request);
}
Register in app/Http/Kernel.php:
protected $routeMiddleware = [
'profile.type' => \App\Http\Middleware\CheckProfileType::class,
];
Policy Integration:
// app/Policies/UserPolicy.php
public function edit(User $user, User $model)
{
return $user->profileType->contains('admin') || $user->id === $model->id;
}
API Responses:
return response()->json([
'user' => $user->load('profileType'),
'profile_types' => $user->profileType->map(fn($type) => [
'type' => $type->type,
'label' => $type->label,
]),
]);
Laravel Nova:
User resource to show profile types:
public function fields(Request $request)
{
return array_merge(parent::fields($request), [
Text::make('Profile Types', function () {
return $this->profileType->pluck('label')->implode(', ');
}),
]);
}
Laravel Jetstream:
create method in app/Http/Controllers/UserController.php to assign default profile types:
$user->profileType()->attach(config('users-profile-type.default_types'));
Validation:
use BaksDev\UsersProfileType\Rules\ValidProfileType;
$request->validate([
'profile_type' => ['required', new ValidProfileType],
]);
Seeding:
// database/seeders/ProfileTypeSeeder.php
public function run()
{
foreach (config('users-profile-type.types') as $type => $config) {
UserProfileType::updateOrCreate(['type' => $type], $config);
}
}
Migration Conflicts:
user_profile_types table, run php artisan doctrine:migrations:diff to regenerate migrations.baks:assets:install command to reset configurations.Caching Issues:
Cache::forget('user-profile-types') after updates.config(['users-profile-type.cache_enabled' => false]);
Translation Missing:
users-profile-type:: prefix for translations. Ensure your config/app.php includes:
'providers' => [
BaksDev\UsersProfileType\UsersProfileTypeServiceProvider::class,
],
'aliases' => [
'ProfileType' => BaksDev\UsersProfileType\Facades\ProfileType::class,
],
Permission Overlap:
admin and super_admin). Use a unique type field.'type' => ['required', 'string', Rule::unique('user_profile_types', 'type')],
Doctrine ORM Conflicts:
config/database.php does not mix configurations. The package assumes Eloquent by default.Log Profile Type Assignments:
\BaksDev\UsersProfileType\Logging::enable();
Check logs in storage/logs/laravel.log for assignment/revocation events.
Dump User Profile Types:
\BaksDev\UsersProfileType\Facades\ProfileType::dump($user);
Check Database State:
-- Verify pivot table
SELECT * FROM user_profile_type_pivot WHERE user_id = 1;
-- Verify profile types
SELECT * FROM user_profile_types;
Custom Profile Type Logic:
Override the BaksDev\UsersProfileType\Contracts\ProfileTypeResolver interface to add custom resolution logic (e.g., dynamic types based on user attributes).
Events: Listen for profile type changes:
// app/Providers/EventServiceProvider.php
protected $listen = [
\BaksDev\UsersProfileType\Events\ProfileTypeAssigned::class => [
\App\Listeners\LogProfileTypeAssignment::class,
],
];
API Resources:
Extend the default ProfileTypeResource:
namespace App\Http\Resources;
use BaksDev\UsersProfileType\Http\Resources\ProfileTypeResource as BaseResource;
class CustomProfileTypeResource extends BaseResource
{
public function toArray($request)
{
$array = parent::toArray($request);
$array['custom_field'] = $this->custom_field;
return $array;
}
}
Commands:
Create custom commands by extending BaksDev\UsersProfileType\Console\Commands\ProfileTypeCommand:
php artisan make:command CustomProfileTypeCommand
Then inject the ProfileTypeManager service.
Default Types:
Set default profile types in config/users-profile-type.php:
'default_types' => ['user'], // Assigned to new users
Icon Handling: The package expects Font Awesome icons by default. For custom icons:
'types' => [
'custom' => [
'icon' => 'path/to/custom-icon.svg',
],
],
Ensure your CSS/JS includes the custom icon.
Localization:
Override translations in resources/lang/en/users-profile-type.php:
return [
'assigned_to' => 'Assigned to user :username',
];
Performance: Disable eager loading if not needed:
config(['users-profile-type.eager_load' => false]);
Then manually load relationships:
$user->load('profileType');
How can I help you explore Laravel packages today?