kunicmarko / sonata-auto-configure-bundle
Symfony Bundle that auto configures Sonata Admin.
Installs: 31 562
Dependents: 0
Suggesters: 0
Security: 0
Stars: 15
Watchers: 3
Forks: 4
Open Issues: 2
Type:symfony-bundle
Requires
- php: ^7.1
- doctrine/annotations: ^1.6
- doctrine/inflector: ^1.3
- sonata-project/admin-bundle: ^3.35
- symfony/config: ^3.4 || ^4.0 || ^4.1
- symfony/dependency-injection: ^3.4 || ^4.0 || ^4.1
- symfony/http-kernel: ^3.4 || ^4.0 || ^4.1
Requires (Dev)
- behat/behat: ^3.5
- behat/mink: 1.7.x-dev
- behat/mink-browserkit-driver: ^1.3
- behat/mink-extension: ^2.3
- behat/mink-goutte-driver: ^1.2
- behat/mink-selenium2-driver: ^1.3
- behat/symfony2-extension: ^2.1
- doctrine/doctrine-fixtures-bundle: ^3.0
- matthiasnoback/symfony-dependency-injection-test: ^3.0
- sonata-project/doctrine-orm-admin-bundle: ^3.6
- symfony/phpunit-bridge: ^4.0
README
Tries to auto configure your admin classes and extensions, so you don't have to.
Documentation
Installation
1. Add dependency with Composer
composer require kunicmarko/sonata-auto-configure-bundle
2. Enable the bundle for all Symfony environments:
// bundles.php return [ //... KunicMarko\SonataAutoConfigureBundle\SonataAutoConfigureBundle::class => ['all' => true], ];
Configuration
sonata_auto_configure: admin: suffix: Admin manager_type: orm label_catalogue: ~ label_translator_strategy: ~ translation_domain: ~ group: ~ pager_type: ~ entity: namespaces: - { namespace: App\Entity, manager_type: orm } controller: suffix: Controller namespaces: - App\Controller\Admin
How does it work
This bundle tries to guess some stuff about your admin class. You only have to create your admin classes and be sure that the admin directory is included in auto discovery and that autoconfigure is enabled.
This bundle will tag your admin classes with sonata.admin
, then we find all
admin classes and if autoconfigure is enabled we take the class name. If you
defined a suffix in the config (by default it is Admin
) we remove it to get
the name of the entity, so if you had CategoryAdmin
we get Category
.
After that we check if the AdminOption
annotation is present, annotations
have a higher priority than our guesses. If no annotation is defined or some of
the values that are mandatory are not present we still try to guess.
First, we set the label and based on previous example it will be Category
.
Then, we set the admin code which will be the service id, in our case it is the class name.
After, we try to find the Category
entity in the list of namespaces you
defined (by default it is just App\Entity
). If the entity is not found an
exception is thrown and you will probably need to use an annotation to define
the entity. You can set the manager_type
attribute per namespace.
By default we will take manager_type
from annotations, if they are not
present we will take it from the namespace definition. If you define the entity
in your annotation but not the manager_type
then we will take the manager
type from the bundle configuration that will be available as a
sonata_auto_configure.admin.manager_type
parameter.
Then we try to guess a controller, same as for the entity we try to guess it in
the list of namespaces but we add a suffix (as in most situations people name
it CategoryController
) that you can disable in configuration. If there is no
controller we leave it as null
and sonata will add its default controller.
And that is it. We have all the info we need for defining an admin class, if
you used some of the other tag options when defining your admin class you will
have to use Annotation or register admin on your own with autoconfigure: false
that would look like:
App\Admin\CategoryAdmin: arguments: [~, App\Entity\Category, ~] autoconfigure: false tags: - { name: sonata.admin, manager_type: orm, label: Category } public: true
Since your admin class is autowired you can still use setter injection but you have to add a @required
annotation:
/** * @required */ public function setSomeService(SomeService $someService) { $this->someService = $someService; }
Annotation
AdminOptions
<?php namespace App\Admin; use KunicMarko\SonataAutoConfigureBundle\Annotation as Sonata; use App\Controller\Admin\CategoryController; use App\Entity\Category; use Sonata\AdminBundle\Admin\AbstractAdmin; /** * @Sonata\AdminOptions( * label="Category", * managerType="orm", * group="Category", * showInDashboard=true, * showMosaicButton=true, * keepOpen=true, * onTop=true, * icon="<i class='fa fa-user'></i>", * labelTranslatorStrategy="sonata.admin.label.strategy.native", * labelCatalogue="App", * translationDomain="messages", * pagerType="simple", * controller=CategoryController::class, * entity=Category::class, * adminCode="admin_code", * autowireEntity=true, * templates={ * "list": "admin/category/list.html.twig" * }, * children={"app.admin.product"} * ) */ final class CategoryAdmin extends AbstractAdmin { }
AdminExtensionOptions
<?php namespace App\Admin; use KunicMarko\SonataAutoConfigureBundle\Annotation as Sonata; use Sonata\AdminBundle\Admin\AbstractAdminExtension; /** * @Sonata\AdminExtensionOptions( * global=true * ) */ final class GlobalExtension extends AbstractAdminExtension { }
<?php namespace App\Admin; use KunicMarko\SonataAutoConfigureBundle\Annotation as Sonata; use Sonata\AdminBundle\Admin\AbstractAdminExtension; use App\Admin\ActivityAdmin; /** * @Sonata\AdminExtensionOptions( * target={"app.admin.project", ActivityAdmin::class} * ) */ final class SortableExtension extends AbstractAdminExtension { }