Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Users Profile Type Laravel Package

baks-dev/users-profile-type

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require baks-dev/users-profile-type
    php artisan vendor:publish --provider="BaksDev\UsersProfileType\UsersProfileTypeServiceProvider" --tag="migrations"
    php artisan migrate
    
  2. Publish Assets (if needed):

    php artisan baks:assets:install
    
  3. 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',
        ],
    ],
    
  4. Assign to User:

    use BaksDev\UsersProfileType\Models\UserProfileType;
    
    $user = User::find(1);
    $user->profileType()->attach(UserProfileType::where('type', 'admin')->first());
    

Implementation Patterns

Core Workflows

  1. Profile Type Management:

    • CRUD via Eloquent:
      // Create
      $profileType = UserProfileType::create(['type' => 'moderator']);
      
      // Fetch
      $types = UserProfileType::all();
      
      // Update
      $profileType->update(['description' => 'New description']);
      
      // Delete
      $profileType->delete();
      
  2. User Assignment:

    • Many-to-Many Relationship:
      // 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');
      
  3. 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,
    ];
    
  4. Policy Integration:

    // app/Policies/UserPolicy.php
    public function edit(User $user, User $model)
    {
        return $user->profileType->contains('admin') || $user->id === $model->id;
    }
    
  5. API Responses:

    return response()->json([
        'user' => $user->load('profileType'),
        'profile_types' => $user->profileType->map(fn($type) => [
            'type' => $type->type,
            'label' => $type->label,
        ]),
    ]);
    

Integration Tips

  1. Laravel Nova:

    • Extend the 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(', ');
              }),
          ]);
      }
      
  2. Laravel Jetstream:

    • Override the create method in app/Http/Controllers/UserController.php to assign default profile types:
      $user->profileType()->attach(config('users-profile-type.default_types'));
      
  3. Validation:

    use BaksDev\UsersProfileType\Rules\ValidProfileType;
    
    $request->validate([
        'profile_type' => ['required', new ValidProfileType],
    ]);
    
  4. Seeding:

    // database/seeders/ProfileTypeSeeder.php
    public function run()
    {
        foreach (config('users-profile-type.types') as $type => $config) {
            UserProfileType::updateOrCreate(['type' => $type], $config);
        }
    }
    

Gotchas and Tips

Pitfalls

  1. Migration Conflicts:

    • If you manually alter the user_profile_types table, run php artisan doctrine:migrations:diff to regenerate migrations.
    • Fix: Always use the published migrations or the baks:assets:install command to reset configurations.
  2. Caching Issues:

    • Profile type checks in middleware/policies may not update if the cache is enabled. Use Cache::forget('user-profile-types') after updates.
    • Tip: Disable caching during development:
      config(['users-profile-type.cache_enabled' => false]);
      
  3. Translation Missing:

    • The package uses users-profile-type:: prefix for translations. Ensure your config/app.php includes:
      'providers' => [
          BaksDev\UsersProfileType\UsersProfileTypeServiceProvider::class,
      ],
      'aliases' => [
          'ProfileType' => BaksDev\UsersProfileType\Facades\ProfileType::class,
      ],
      
  4. Permission Overlap:

    • Avoid duplicate profile types (e.g., admin and super_admin). Use a unique type field.
    • Validation: Add a unique rule in your form requests:
      'type' => ['required', 'string', Rule::unique('user_profile_types', 'type')],
      
  5. Doctrine ORM Conflicts:

    • If using both Eloquent and Doctrine, ensure your config/database.php does not mix configurations. The package assumes Eloquent by default.

Debugging

  1. Log Profile Type Assignments:

    \BaksDev\UsersProfileType\Logging::enable();
    

    Check logs in storage/logs/laravel.log for assignment/revocation events.

  2. Dump User Profile Types:

    \BaksDev\UsersProfileType\Facades\ProfileType::dump($user);
    
  3. Check Database State:

    -- Verify pivot table
    SELECT * FROM user_profile_type_pivot WHERE user_id = 1;
    
    -- Verify profile types
    SELECT * FROM user_profile_types;
    

Extension Points

  1. Custom Profile Type Logic: Override the BaksDev\UsersProfileType\Contracts\ProfileTypeResolver interface to add custom resolution logic (e.g., dynamic types based on user attributes).

  2. Events: Listen for profile type changes:

    // app/Providers/EventServiceProvider.php
    protected $listen = [
        \BaksDev\UsersProfileType\Events\ProfileTypeAssigned::class => [
            \App\Listeners\LogProfileTypeAssignment::class,
        ],
    ];
    
  3. 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;
        }
    }
    
  4. Commands: Create custom commands by extending BaksDev\UsersProfileType\Console\Commands\ProfileTypeCommand:

    php artisan make:command CustomProfileTypeCommand
    

    Then inject the ProfileTypeManager service.


Configuration Quirks

  1. Default Types: Set default profile types in config/users-profile-type.php:

    'default_types' => ['user'], // Assigned to new users
    
  2. 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.

  3. Localization: Override translations in resources/lang/en/users-profile-type.php:

    return [
        'assigned_to' => 'Assigned to user :username',
    ];
    
  4. Performance: Disable eager loading if not needed:

    config(['users-profile-type.eager_load' => false]);
    

    Then manually load relationships:

    $user->load('profileType');
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
emuniq/filament-browser-notifications
syriable/filament-translator
hungnm28/livewire-form
wenprise/eloquent
crudly/encrypted
fadion/bouncy
cuci/prototurk-sdk
gos/pubsub-router-bundle
cuci/prototurk-sdk-symfony
clementtalleu/easyadmin-markdown-bundle
codeflextech/permission-manager
karnoweb/livewire-datepicker
sayedenam/sayed-dashboard
milito/query-filter
apiboxsym/user-bundle
apiboxsym/health-check-bundle
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui