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

Platform User Bundle Laravel Package

digitalstate/platform-user-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require digitalstate/platform-user-bundle
    

    Ensure OroUserBundle is already installed (this bundle extends it).

  2. Enable the Bundle Add to config/bundles.php:

    return [
        // ...
        DigitalState\PlatformUserBundle\DigitalStatePlatformUserBundle::class => ['all' => true],
    ];
    
  3. First Use Case: Resolving Session Data Inject the ds.data.data service and resolve session-based user data:

    use Symfony\Component\HttpFoundation\RequestStack;
    
    class MyController extends AbstractController
    {
        public function __construct(
            private RequestStack $requestStack,
            private $dataResolver // Autowire via `ds.data.data`
        ) {}
    
        public function showUserData()
        {
            $username = $this->dataResolver->resolve('ds.session.user.username');
            // Use $username (e.g., pre-fill a form)
        }
    }
    
  4. Key Configuration Check config/packages/digitalstate_platform_user.yaml for resolver mappings (if any). Override defaults in config/packages/overrides/digitalstate_platform_user.yaml.


Implementation Patterns

1. Session-Based Data Resolution

Workflow:

  • Use ds.session.user.<key> to resolve session data tied to the authenticated user.
  • Ideal for pre-filling forms, dynamic UI elements, or conditional logic.

Example: Form Pre-Population

class UserProfileType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $dataResolver = $this->container->get('ds.data.data');
        $defaultRole = $dataResolver->resolve('ds.session.user.role');

        $builder
            ->add('role', ChoiceType::class, [
                'choices' => ['admin' => 'Admin', 'editor' => 'Editor'],
                'data' => $defaultRole,
            ]);
    }
}

2. Integration with OroUserBundle

Leverage existing OroUserBundle features (e.g., user entities, roles) while extending them:

// Extend user entity (e.g., add custom fields)
namespace App\Entity;

use DigitalState\PlatformUserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class User extends BaseUser
{
    #[ORM\Column(type: 'string', nullable: true)]
    private ?string $customField = null;

    // Getters/setters...
}

3. Migration Extensions

Use the bundle’s migration tools to:

  • Add custom user fields via migrations.
  • Example (in a custom migration):
    use DigitalState\PlatformUserBundle\Migration\Extension\UserExtension;
    
    public function up(Schema $schema)
    {
        $userExtension = new UserExtension($this->connection);
        $userExtension->addUserField('custom_field', 'string', ['nullable' => true]);
    }
    

4. Event Listeners

Extend user lifecycle events (e.g., user.login, user.update):

// src/EventListener/UserListener.php
namespace App\EventListener;

use DigitalState\PlatformUserBundle\Event\UserEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class UserListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            UserEvent::USER_LOGIN => 'onUserLogin',
        ];
    }

    public function onUserLogin(UserEvent $event)
    {
        $user = $event->getUser();
        // Custom logic (e.g., log activity, update session)
    }
}

Gotchas and Tips

Pitfalls

  1. Session Dependency

    • Resolved data (ds.session.user.*) only works for authenticated users. Always provide fallbacks:
      $username = $this->dataResolver->resolve('ds.session.user.username', 'guest');
      
  2. OroUserBundle Conflicts

    • If extending User entity, ensure your class does not conflict with Oro’s autogenerated proxies. Use #[ORM\Entity(repositoryClass: 'App\Repository\UserRepository')] explicitly.
  3. Migration Order

    • Run migrations after enabling the bundle. Use php bin/console doctrine:migrations:execute if needed.
  4. Resolver Caching

    • Session resolvers are not cached. Avoid heavy operations in resolved data (e.g., database queries).

Debugging Tips

  • Check Resolver Keys: Use ds.session.user.<key> format. Verify keys exist in config/packages/digitalstate_platform_user.yaml.
  • Symfony Profiler: Inspect resolved data via the Data Resolver panel in the profiler.
  • Event Debugging: Enable event dispatching logs:
    # config/services.yaml
    DigitalState\PlatformUserBundle\EventListener\UserListener:
        tags: ['kernel.event_subscriber']
        arguments:
            $debug: '%kernel.debug%'
    

Extension Points

  1. Custom Resolvers Add new resolver types by implementing DigitalState\PlatformDataBundle\Resolver\ResolverInterface and register them in the bundle’s configuration.

  2. Override Session Data Modify session data before resolution via an event subscriber:

    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        if ($request->hasSession()) {
            $request->getSession()->set('ds.session.user.custom_key', 'value');
        }
    }
    
  3. Form Integration Create a custom form extension to auto-resolve session data:

    use Symfony\Component\Form\AbstractTypeExtension;
    use Symfony\Component\Form\FormBuilderInterface;
    
    class SessionDataExtension extends AbstractTypeExtension
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->addEventListener(FormEvents::PRE_SET_DATA, function ($event) {
                $data = $event->getData();
                $dataResolver = $this->container->get('ds.data.data');
                $data->setDefaultRole($dataResolver->resolve('ds.session.user.role'));
            });
        }
    }
    

Performance

  • Avoid Over-Resolution: Resolve data once (e.g., in a controller) and pass it to services/views.
  • Batch Resolutions: For multiple keys, resolve in a single call if the bundle supports batching (check docs).
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.
datacore/hub-sdk
alengo/sulu-http-cache-bundle
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony
develia/geo-bundle
dreamzy/livewire-charts
touchestate-sdk/php-sdk
22h/doctrine-garbage-collection-bundle
imbo/imbo-coding-standard
visualbuilder/filament-lottie
servicioslineaonce/starter-kit
atomcoder/laravel-reorderable
irajul/filament-shadcn-theme
agtp/agtp-php
agtp/mod-php
centraldesktop/protobuf-php
trappistes/laravel-custom-fields
splash/sonata-admin
splash/metadata