Installation via Symlink (as per README):
mkdir -p src/Awaresoft
git clone https://github.com/awaresoft/SonataAdminBundle.git src/Awaresoft/SonataAdminBundle
Ensure composer.json excludes the package from vendor installation (remove from require/require-dev).
Enable Bundle in config/bundles.php:
return [
// ...
Awaresoft\SonataAdminBundle\SonataAdminBundle::class => ['all' => true],
];
Configure Database (if using Doctrine):
php bin/console doctrine:database:create
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
First Admin CRUD:
php bin/console sonata:admin:generate:crud --entity=App\Entity\YourEntity --format=yml --dest=config/sonata_admin
Register the admin in config/packages/sonata_admin.yaml:
sonata_admin:
options:
models_namespace: App\Entity
admin_code_generator_template: 'twig:SonataAdminBundle:CRUD:base_admin_class.html.twig'
managers:
app:
class: SonataAdminBundle\Admin\ORM\SonataAdminORMManager
entity_directories: [App\Entity]
Clear Cache:
php bin/console cache:clear
User entities.php bin/console sonata:admin:generate:crud --entity=App\Entity\User --format=yml
config/sonata_admin/user_admin.yml):
sonata_admin:
app.admin.user:
class: App\Admin\UserAdmin
arguments:
- ~
- App\Entity\User
- SonataAdminBundle:CRUD
tags:
- { name: sonata.admin, manager_type: orm, group: Users, label: User }
src/Admin/UserAdmin.php):
namespace App\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
class UserAdmin extends AbstractAdmin {
protected function configureDatagridFilters(DatagridMapper $filter) {
$filter->add('name');
}
protected function configureFormFields(FormMapper $form) {
$form->add('name');
}
}
/admin/app_user in your browser.Admin Generation:
sonata:admin:generate:crud for boilerplate (avoid manual CRUD creation).Entity Integration:
id (primary key).createdAt/updatedAt (if using timestamps).php bin/console sonata:admin:generate:crud --entity=App\Entity\Product --format=php
prePersist(), postUpdate()).Grouping Admins:
sonata_admin:
managers:
app:
group: [Users, Products, Settings]
Field Customization:
configureFormFields() for form layout:
$form->add('name', TextType::class, ['label' => 'Full Name']);
$form->add('isActive', CheckboxType::class, ['required' => false]);
configureListFields() for list views:
$list->add('name', 'string', ['template' => 'SonataAdminBundle:CRUD:base_list_field.html.twig']);
Permissions:
security.yaml:
access_control:
- { path: ^/admin/, roles: ROLE_ADMIN }
isGranted() in admin classes:
public function isAccessible() {
return $this->getConfigurationPool()->getContainer()->get('security.authorization_checker')->isGranted('ROLE_ADMIN');
}
Doctrine Extensions:
stof/doctrine-extensions-bundle for soft deletes, timestamps, etc.:
# config/packages/doctrine.yaml
doctrine:
orm:
filters:
softdeleteable:
class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
enabled: true
Twig Templates:
templates/SonataAdminBundle/:
{# templates/SonataAdminBundle/CRUD/base_list_field.html.twig #}
{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
{% block field %}{{ value|upper }}{% endblock %}
API Integration:
sonata-project/google-maps-bundle for maps or sonata-project/easy-extends-bundle for dynamic fields.Event Listeners:
sonata.admin.post_persist):
// src/EventListener/AdminListener.php
namespace App\EventListener;
use Sonata\AdminBundle\Event\ConfigureEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class AdminListener implements EventSubscriberInterface {
public static function getSubscribedEvents() {
return [
'sonata.admin.configure', // Fires before admin config
];
}
public function onConfigure(ConfigureEvent $event) {
$event->getAdmin()->setTemplate('edit', 'AppBundle:Admin:edit.html.twig');
}
}
Batch Actions:
sonata_admin:
app.admin.product:
batch_actions: ['delete']
protected function configureBatchActions(DatagridMapper $datagrid) {
$datagrid->add('delete', null, ['label' => 'Delete']);
}
Symlink Issues:
vendor/ or update autoload_psr4.php.composer dump-autoload after symlinking.Cache Dependencies:
php bin/console cache:clear
php bin/console debug:cache:clear
Doctrine Migrations:
# config/packages/doctrine.yaml
doctrine:
orm:
auto_generate_proxy_classes: false
Permission Denied:
ROLE_ADMIN.ROLE_ADMIN in security.yaml.sonata.admin.security.handler is configured:
sonata_admin:
security:
handler: sonata.admin.security.handler.role
YAML vs. PHP Conflicts:
Enable Debug Mode:
# config/packages/dev/sonata_admin.yaml
sonata_admin:
debug: true
Log Admin Events:
sonata.admin.event in monolog config:
monolog:
handlers:
sonata_admin:
type: stream
path: "%kernel.logs_dir%/sonata_admin.log"
level: debug
channels: ["sonata_admin"]
Check SQL Queries:
php bin/console debug:container sonata.admin.orm.profiler
How can I help you explore Laravel packages today?