Installation
composer require blast-project/core-bundle
Add to config/bundles.php:
return [
// ...
Blast\CoreBundle\BlastCoreBundle::class => ['all' => true],
];
Basic Configuration
Create a YAML config file (e.g., config/blast/core.yml):
blast_core:
admin:
app:
namespace: 'App\Admin'
base_class: 'Sonata\AdminBundle\Admin\Admin'
traits: ['Sonata\AdminBundle\Admin\Traits\HistoryTrait']
First Use Case
Define an admin class in YAML (e.g., config/admin/sonata/product.yml):
sonata.admin.product:
class: App\Admin\ProductAdmin
label: Product
label_catalogue: AppBundle
model_class: App\Entity\Product
translation: false
show_in_dashboard: true
show_as_link: false
options:
field_description:
template: 'admin/product/description.html.twig'
Admin Inheritance: Extend base admin classes via YAML:
sonata.admin.product:
extends: sonata.admin.app_base
options:
form:
type: App\Form\ProductType
Trait Integration: Apply traits dynamically:
sonata.admin.product:
traits:
- Sonata\AdminBundle\Admin\Traits\DateTimeTrait
- App\Admin\Traits\CustomExportTrait
Entity Relationships: Configure relationships without PHP:
sonata.admin.product:
options:
fields:
categories:
type: sonata_type_model_list
admin: sonata.admin.category
config/blast/blocks/export.yml):
export_block:
options:
export:
type: sonata_type_orm_csv
fields: ['id', 'name']
Then merge into admin configs:
sonata.admin.product:
<<: *export_block
sonata.admin.product:
options:
template:
list: 'admin/product/list.html.twig'
edit: 'admin/product/edit.html.twig'
Admin Generation:
Use the blast:generate:admin command to scaffold admins from YAML:
php bin/console blast:generate:admin Product
Validation: Validate YAML configs with:
php bin/console blast:validate:admin
Hot Reloading:
Enable blast_core.debug in config to auto-reload YAML changes during dev.
Circular Dependencies:
Avoid circular references in extends or trait inheritance. Use blast:validate:admin to catch issues early.
Namespace Conflicts:
Ensure namespace in blast_core.admin.app matches your actual admin namespace. Misconfigurations cause ClassNotFoundException.
Trait Loading Order: Traits are loaded alphabetically. Explicitly order critical traits in YAML:
traits:
- App\Admin\Traits\CriticalTrait # Loads first
- Sonata\AdminBundle\Admin\Traits\HistoryTrait
Entity Metadata: The bundle assumes Doctrine metadata is up-to-date. Run:
php bin/console doctrine:schema:update --force
if entity changes aren’t reflected.
Enable Debug Mode:
blast_core:
debug: true
Logs YAML parsing and admin generation steps to var/log/dev.log.
Dumping Configs:
Use the blast:dump:config command to inspect merged configs:
php bin/console blast:dump:config sonata.admin.product
Custom YAML Tags: Extend YAML parsing by creating a custom tag:
# config/blast/tags/custom.yml
custom_tag:
class: App\Blast\Yaml\CustomTag
tag: '!custom'
Event Listeners:
Subscribe to blast.admin.pre_generate and blast.admin.post_generate events to modify admin classes dynamically:
// src/EventListener/AdminListener.php
public function onAdminGenerate(AdminGenerateEvent $event) {
$event->getAdmin()->addTrait('App\Admin\Traits\CustomTrait');
}
Override Generators: Replace the default admin generator by binding your own service:
services:
blast.admin.generator:
class: App\Generator\CustomAdminGenerator
tags: ['blast.admin.generator']
Cache YAML Parsing:
Enable blast_core.cache to cache parsed YAML configs (default: true in dev env).
Selective Loading:
Use blast_core.admin.load_only to load specific admins on demand:
blast_core:
admin:
load_only: ['sonata.admin.product', 'sonata.admin.category']
Boolean Values:
YAML booleans (true/false) must be lowercase. Uppercase (TRUE/FALSE) is ignored.
Array Syntax: Prefer flow style for multi-line arrays:
options:
fields:
- { name: 'id', type: 'integer' }
- { name: 'name', type: 'string' }
Avoid block style for complex nested structures.
Inheritance Merge:
Child configs override parent configs. Use <<: *parent to merge instead of override:
sonata.admin.product_variant:
<<: *sonata.admin.product
label: Product Variant
How can I help you explore Laravel packages today?