Installation
composer require ardteam/admin-project
Add the bundle to AppKernel.php (Symfony 2.x) or config/bundles.php (Symfony 3.x+):
new Ardteam\AdminProjectBundle\ArdteamAdminProjectBundle(),
First Use Case: CRUD Admin Panel
SonataAdminBundle (already included) to create a custom admin class:
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
class PostAdmin extends AbstractAdmin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('title')
->add('content');
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('title');
}
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->add('title')
->add('createdAt');
}
}
services.yml:
services:
app.admin.post:
class: AppBundle\Admin\PostAdmin
arguments:
- ~
- AppBundle\Entity\Post
- AppBundle:PostAdmin
tags:
- { name: sonata.admin, manager_type: orm, group: Content, label: Post }
AdminLTE Integration
The bundle includes almasaeed2010/adminlte for UI. Ensure app/config/config.yml has:
assetic:
bundles: [FOSJsRoutingBundle, SonataAdminBundle, ArdteamAdminProjectBundle]
twig:
form_themes:
- 'ArdteamAdminProjectBundle:Form:fields.html.twig'
Leverage SonataAdminBundle
configureFormFields(), configureListFields(), etc.Post comments:
$formMapper->add('comments', 'sonata_type_collection', [
'by_reference' => false,
]);
AdminLTE Theming
app/Resources/ArdteamAdminProjectBundle/views/ (e.g., layout.html.twig).app/Resources/public/admin/ and include in config.yml:
assetic:
assets:
admin_styles:
inputs:
- '%kernel.root_dir%/../vendor/almasaeed2010/adminlte/dist/css/adminlte.min.css'
- '%kernel.root_dir%/../vendor/almasaeed2010/adminlte/dist/css/skin-blue.min.css'
- '%kernel.root_dir%/../src/AppBundle/Resources/public/admin/custom.css'
filters: [cssrewrite]
output: 'css/admin.css'
Security Integration
protected function isAccessGranted()
{
return $this->getAuthorizationChecker()->isGranted('ROLE_ADMIN');
}
Event Listeners
sonata.admin.post_persist) for custom logic:
$eventDispatcher->addListener('sonata.admin.post_persist', function ($event) {
$post = $event->getSubject();
$post->setSlug(Str::slug($post->getTitle()));
});
SonataAdminBundle Version Mismatch
sonata-project/admin-bundle: ~2.3. Ensure all dependencies align:
composer require sonata-project/admin-bundle:^2.3 sonata-project/doctrine-orm-admin-bundle:^2.3
composer why-not sonata-project/admin-bundle:^3.0 to debug conflicts.AdminLTE Asset Loading
assetic:dump is run (php bin/console assetic:dump).assetic.bundles (Symfony 2.x) or config/packages/assetic.yaml (Symfony 3.x+).{% block javascripts %} in layout.html.twig to manually include:
{{ parent() }}
<script src="{{ asset('bundles/ardteamadminproject/js/adminlte.js') }}"></script>
Doctrine ORM Quirks
doctrine/orm: ~2.2. Newer versions may break compatibility.EntityManager or patch the bundle.Translation Issues
translations/messages.en.yml:
sonata_admin:
list:
actions:
list: List
edit: Edit
delete: Delete
Enable Sonata Debug Tool
Add to config.yml:
sonata_admin:
templates:
layout: 'SonataAdminBundle::standard_layout.html.twig'
debug: true # Enable for dev
Log Sonata Events
Configure Monolog in config.yml:
monolog:
handlers:
sonata:
type: stream
path: "%kernel.logs_dir%/sonata.log"
level: debug
Check Route Conflicts
Run php bin/console debug:router to ensure admin routes (e.g., /admin/post) don’t clash with custom routes.
Custom Admin Classes
Ardteam\AdminProjectBundle\Admin\BaseAdmin (if available) for shared logic:
class BaseAppAdmin extends Ardteam\AdminProjectBundle\Admin\BaseAdmin
{
protected function configureSideMenu()
{
$this->menu->addChild('Dashboard', 'fa-home');
}
}
Dynamic Permissions Use Symfony’s voter system with Sonata:
$this->addPermission('EDIT', 'Edit Post', 'edit');
$this->addPermission('DELETE', 'Delete Post', 'delete');
API Integration
Combine with FOSRestBundle to expose admin actions as APIs:
sonata_admin:
options:
rest:
enabled: true
How can I help you explore Laravel packages today?