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

Easyadmin Bundle Laravel Package

easycorp/easyadmin-bundle

View on GitHub
Deep Wiki
Context7
## Getting Started

### Minimal Setup
1. **Installation**:
   ```bash
   composer require easycorp/easyadmin-bundle

Add to config/bundles.php if not auto-discovered:

return [
    // ...
    EasyCorp\Bundle\EasyAdminBundle\EasyAdminBundle::class => ['all' => true],
];
  1. Generate a Dashboard:

    php bin/console make:admin:dashboard
    

    This creates a basic dashboard at /admin with a default layout.

  2. Generate CRUD for an Entity:

    php bin/console make:admin:crud
    

    Follow prompts to select an entity (e.g., App\Entity\Post). This generates a CRUD controller with default configurations.

  3. Access the Admin Panel: Visit /admin in your browser. Log in with Symfony’s security credentials (configured in security.yaml).


First Use Case: Quick CRUD for a Blog Post

  1. Entity Setup: Ensure you have a Doctrine entity (e.g., Post with fields like title, content, publishedAt).

    // src/Entity/Post.php
    #[ORM\Entity]
    class Post {
        #[ORM\Column]
        private string $title;
    
        #[ORM\Column(type: 'text')]
        private string $content;
    
        #[ORM\Column]
        private \DateTimeInterface $publishedAt;
    }
    
  2. Generate CRUD:

    php bin/console make:admin:crud Post
    

    This creates src/Controller/Admin/PostCrudController.php with auto-generated CRUD logic.

  3. Customize Fields (Optional): Override the controller to tweak field types or layouts:

    // src/Controller/Admin/PostCrudController.php
    public static function getEntityFqcn(): string {
        return Post::class;
    }
    
    public function configureFields(string $pageName): iterable {
        return [
            Field::new('title')->required(),
            Field::new('content')->onlyOnForms(),
            Field::new('publishedAt')->setFormTypeOption('widget', 'single_text'),
        ];
    }
    
  4. Test: Visit /admin/post to manage Post entities with pre-built CRUD operations (list, create, edit, delete).


Key First Steps Summary

  • Install the bundle and enable it.
  • Generate a dashboard (make:admin:dashboard).
  • Generate CRUD for an entity (make:admin:crud).
  • Customize fields/layouts in the generated controller.
  • Access /admin to interact with the admin panel.

Implementation Patterns

1. CRUD Generation Workflow

Standard CRUD

  • Use make:admin:crud to auto-generate a CRUD controller for an entity.
  • The command infers fields from Doctrine annotations/attributes and generates:
    • Index page (list/view records).
    • Create/Edit forms.
    • Delete actions.
    • Basic filtering/pagination.

Customizing CRUD

Override the generated controller (PostCrudController) to:

  • Modify Fields:
    public function configureFields(string $pageName): iterable {
        return [
            Field::new('title')
                ->setLabel('Blog Post Title')
                ->required()
                ->autocomplete(),
            Field::new('content')->onlyOnForms()->setFormTypeOption('attr', ['rows' => 5]),
            Field::new('publishedAt')->setFormTypeOption('widget', 'single_text'),
        ];
    }
    
  • Add Custom Actions:
    public function configureActions(Actions $actions): Actions {
        return $actions
            ->add(CustomCrudController::NEW_ACTION, CustomCrudController::class, 'publish')
            ->add(CrudController::PAGE_INDEX, Button::new('Export', 'fas fa-file-export')->linkToRoute('app_export_posts'));
    }
    
  • Change Page Layout:
    public function configurePages(Pages $pages): Pages {
        return $pages
            ->add(CrudController::PAGE_INDEX, IndexPage::new()->setTitle('Posts'))
            ->add(CrudController::PAGE_EDIT, EditPage::new()->setTitle('Edit Post'));
    }
    

Field Types

Leverage 30+ built-in field types:

  • Associations: AssociationField, CollectionField.
  • Media: ImageField, FileField, TextEditorField.
  • Specialized: ColorField, UrlField, JsonField.
  • Example:
    Field::new('author')->setFormTypeOption('by_reference', false),
    Field::new('image')->setFormType(FileFieldType::class),
    Field::new('tags')->setFormType(CollectionType::class),
    

2. Dashboard Customization

Multi-Dashboard Setup

Create separate dashboards for different user roles:

  1. Generate a new dashboard:
    php bin/console make:admin:dashboard --dashboard=admin_dashboard
    
  2. Configure security in security.yaml:
    access_control:
        - { path: ^/admin/dashboard, roles: ROLE_ADMIN }
        - { path: ^/admin/guest_dashboard, roles: ROLE_GUEST }
    
  3. Override the dashboard controller to customize menus:
    // src/Controller/Admin/AdminDashboardController.php
    public function configureMenuItems(): iterable {
        yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home');
        yield MenuItem::linkToCrud('Posts', 'fas fa-newspaper', Post::class);
        yield MenuItem::linkToRoute('Reports', 'fas fa-chart-bar', 'app_reports');
    }
    

Dynamic Menus

Use closures to conditionally show menu items:

yield MenuItem::linkToCrud(
    'Users',
    'fas fa-users',
    User::class
)->setPermission('ROLE_ADMIN');

3. Security Integration

Role-Based Access Control (RBAC)

  • Entity-Level Permissions:
    public function configurePermissions(string $entityName): array {
        return [
            'POST_CREATE' => 'ROLE_ADMIN',
            'POST_EDIT' => 'ROLE_EDITOR',
            'POST_DELETE' => 'ROLE_ADMIN',
        ];
    }
    
  • Field-Level Visibility:
    Field::new('secretData')->setPermission('ROLE_SUPER_ADMIN'),
    
  • Action-Level Security:
    public function configureActions(Actions $actions): Actions {
        return $actions->disable(CrudController::DELETE);
    }
    

Security Events

Listen to security events to dynamically adjust UI:

// src/EventListener/SecurityListener.php
public function onEasyAdminEvent(EasyAdminEvent $event) {
    if (!$event->getUser()->hasRole('ROLE_ADMIN')) {
        $event->getMenuItems()->clear();
    }
}

4. Advanced Features

Custom Actions

Add buttons with custom logic:

public function configureActions(Actions $actions): Actions {
    return $actions
        ->add(CrudController::PAGE_INDEX, Button::new('Publish All')->linkToRoute('app_publish_all_posts'))
        ->add(CrudController::PAGE_DETAIL, Button::new('Archive')->linkToRoute('app_archive_post')->setIcon('fas fa-archive'));
}

Batch Operations

Enable batch actions for bulk operations:

public function configureActions(Actions $actions): Actions {
    return $actions
        ->batchAction('delete')
        ->batchAction('publish');
}

API Integration

Expose CRUD as an API:

// src/Controller/Admin/ApiPostCrudController.php
#[Route('/api/posts', name: 'api_post_')]
class ApiPostCrudController extends AbstractCrudController {
    public static function getEntityFqcn(): string {
        return Post::class;
    }

    public function configureFields(string $pageName): iterable {
        return [
            Field::new('title')->setFormTypeOption('attr', ['readonly' => true]),
            // ...
        ];
    }
}

5. Templates and Theming

Override Twig Templates

Copy templates from vendor/easycorp/easyadmin-bundle/resources/views/ to templates/admin/ to customize:

  • index.html.twig (list page).
  • edit.html.twig (edit form).
  • crud/dashboard.html.twig (dashboard layout).

Example: Customize the index row template:

{# templates/admin/crud/index_content_row.html.twig #}
<tr>
    <td>{{ easy_admin.entity_id(entity) }}</td>
    <td>{{ easy_admin.field_value(entity, 'title') }}</td>
    <td>
        {% if easy_admin.has_action('edit') %}
            {{ easy_admin.actions(entity, ['edit']) }}
        {% endif %}
    </td>
</tr>

CSS/JS Assets

Extend the bundle’s assets:

  1. Create assets/admin/css/app.css and
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.
calmfox/watch-sylius
damienfern/grpc-symfony-bundle
atoolo/index-bundle
atoolo/genai-bundle
coprotoai/laravel-ticket
davidjln/llm-carbon-bundle
cryonighter/valid-request-bundle
coolms/taxonomy-bundle
coolms/field-bundle
articulate-orm/symfony
aaix/laravel-tall-architect
ephoto/akeneo-connector
emmanuelballery/eb-plantumlbundle
emielburgman/symfony-visitor-beacon
emielburgman/symfony-visit-storage
emielburgman/symfony-security-headers
emielburgman/symfony-log-viewer
emarref/xdebug-bundle
emarref/pubnub-bundle
elriseio/finance-money-bundle