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

Doctrine Orm Admin Bundle Laravel Package

sonata-project/doctrine-orm-admin-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require sonata-project/doctrine-orm-admin-bundle
    

    Ensure SonataDoctrineORMAdminBundle is enabled in config/bundles.php:

    return [
        // ...
        SonataDoctrineORMAdminBundle\SonataDoctrineORMAdminBundle::class => ['all' => true],
    ];
    
  2. First Admin Class: Generate a CRUD admin for an existing entity (e.g., App\Entity\User):

    php bin/console generate:sonata-admin App\Entity\User
    

    This creates a service and admin class (e.g., UserAdmin.php) in src/Admin/.

  3. Register the Admin: Add the admin service to config/packages/sonata_admin.yaml:

    sonata_admin:
        options:
            html5_entities: true
        security:
            handler: sonata.admin.security.handler.role
        assets:
            extra_css:
                - 'bundles/sonataadmin/css/styles.css'
    

    Tag the admin service in src/Admin/UserAdmin.php:

    class UserAdmin extends AbstractAdmin
    {
        protected function configureServices()
        {
            $this->adminCode = 'user';
        }
    }
    
  4. First Use Case: Access /admin/app_user to see the auto-generated CRUD interface for User entities.


Key Files to Review

  • Documentation: Sonata Admin Bundle Docs
  • Configuration: config/packages/sonata_admin.yaml
  • Admin Classes: src/Admin/*Admin.php
  • Templates: templates/SonataAdminBundle/CRUD/* (override defaults here).

Implementation Patterns

Core Workflows

  1. Entity CRUD: Extend AbstractAdmin and override methods for custom logic:

    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->add('id')
            ->add('email')
            ->add('roles', null, ['editable' => false]);
    }
    
  2. Form Customization: Use FormMapper in configureFormFields() to modify fields:

    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->tab('General')
                ->with('Details')
                    ->add('email')
                    ->add('plainPassword', 'text', ['required' => false])
                ->end()
            ->end();
    }
    
  3. Batch Actions: Enable batch operations in configureDatagridFilters() and configureBatchActions():

    protected function configureBatchActions(BatchAction $batchAction)
    {
        $batchAction
            ->add('delete')
            ->add('export', null, ['label' => 'Export']);
    }
    
  4. Filtering: Customize filters in configureDatagridFilters():

    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper
            ->add('email')
            ->add('roles', null, ['field_type' => 'sonata_type_model_list']);
    }
    

Integration Tips

  1. Dependency Injection: Inject services into admin classes via configureServices():

    public function configureServices()
    {
        $this->services = [
            'sonata.admin.user' => [
                'calls' => [
                    ['service', 'setMailer', ['@sonata.mailer.mailer']],
                ],
            ],
        ];
    }
    
  2. Event Listeners: Use Symfony events (e.g., sonata.admin.event.configure) to modify behavior globally:

    // src/EventListener/AdminListener.php
    public function onConfigure(ConfigureEvent $event)
    {
        $event->getAdminPool()->getAdminByAdminCode('user')->setTemplate('base', 'custom_base.html.twig');
    }
    
  3. Template Overrides: Override Sonata’s default templates by copying them to templates/SonataAdminBundle/CRUD/ and modifying:

    {# templates/SonataAdminBundle/CRUD/base_list_field.html.twig #}
    {% extends '@SonataAdmin/CRUD/base_list_field.html.twig' %}
    {% block field %}{{ field }} (Custom suffix){% endblock %}
    
  4. API Integration: Use Sonata’s built-in REST support by enabling sonata_admin_rest and configuring routes:

    # config/routes/sonata_admin.yaml
    sonata_admin_rest:
        resource: "@SonataAdminBundle/Resources/config/routing/sonata_admin_rest.xml"
        prefix: /api
    

Advanced Patterns

  1. Dynamic Admin Generation: Dynamically register admins via a compiler pass or service loader:

    // src/DependencyInjection/Compiler/AdminPass.php
    public function process(ContainerBuilder $container)
    {
        $definition = $container->findDefinition('sonata.admin.pool');
        $definition->addMethodCall('addAdmin', ['App\Admin\UserAdmin']);
    }
    
  2. Multi-Tenancy: Override getEntityManager() to scope queries per tenant:

    public function getEntityManager()
    {
        return $this->getConfigurationPool()->getContainer()->get('tenant.entity_manager');
    }
    
  3. Custom Actions: Add custom actions to the action menu:

    protected function configureActions()
    {
        $actions = [
            'list' => ['icon' => 'fa-list'],
            'custom_action' => ['label' => 'Custom', 'icon' => 'fa-rocket'],
        ];
        return $actions;
    }
    
  4. Field Descriptions: Add tooltips or help text to fields:

    $formMapper->add('email', 'text', [
        'help' => 'Required for login.',
        'attr' => ['placeholder' => 'user@example.com'],
    ]);
    

Gotchas and Tips

Common Pitfalls

  1. Caching Issues: Clear Sonata’s cache after changes:

    php bin/console sonata:cache:clear
    

    Or manually clear the sonata_admin cache:

    php bin/console cache:clear
    
  2. Entity Not Found: Ensure the admin’s adminCode matches the entity’s short class name (e.g., UserAdmin for App\Entity\User).

  3. Permission Denied: Verify ROLE_SONATA_ADMIN is assigned to users. Customize roles in configureSecurity():

    protected function configureSecurity()
    {
        $security = $this->getSecurity();
        $security->addPermission('EDIT', 'POST_EDIT');
    }
    
  4. Template Not Overridden: Ensure template files are placed in templates/SonataAdminBundle/ (not templates/bundles/sonataadmin/).

  5. Doctrine Query Issues: Override createQuery() or createListQuery() to modify queries:

    public function createQuery($context = 'list')
    {
        $query = parent::createQuery($context);
        $query->andWhere('u.enabled = :enabled');
        $query->setParameter('enabled', true);
        return $query;
    }
    

Debugging Tips

  1. Enable Debug Mode: Set sonata_admin.debug to true in config/packages/sonata_admin.yaml to see SQL queries and admin events.

  2. Log Admin Events: Enable logging for sonata.admin in config/packages/monolog.yaml:

    handlers:
        sonata_admin:
            type: stream
            path: "%kernel.logs_dir%/sonata_admin.log"
            level: debug
            channels: ["sonata.admin"]
    
  3. Dump Admin Configuration: Use the debug command to inspect admin settings:

    php bin/console debug:sonata-admin
    
  4. Check for Deprecations: Sonata 4.x may deprecate some 3.x features. Review the upgrade guide.


Configuration Quirks

  1. Datagrid Default Order: Set default sorting in configureDatagrid():

    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper->add('id', null, [], null, ['order' => 'DESC']);
    }
    
  2. Mass Actions: Ensure sonata.admin.security.handler is configured to allow mass actions:

    sonata_admin:
        security:
            handler: sonata.admin.security.handler.role
            information:
                ROLE_SONATA_ADMIN: [MASTER]
    
  3. Field Types: Use Sonata’s custom field types (e.g., sonata_type_model_list) for relationships

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.
comsave/common
alecsammon/php-raml-parser
chrome-php/wrench
lendable/composer-license-checker
typhoon/reflection
mesilov/moneyphp-percentage
mike42/gfx-php
bookdown/themes
aura/view
aura/html
aura/cli
povils/phpmnd
nayjest/manipulator
omnipay/tests
psr-mock/http-message-implementation
psr-mock/http-factory-implementation
psr-mock/http-client-implementation
voku/email-check
voku/urlify
rtheunissen/guzzle-log-middleware