Использование нескольких расширений (оболочек) с EasyAdminBundle (Wandi, AlterPHP)

Я хотел бы использовать расширение AlterPHP, а также расширение Wandi с EasyAdminBundle.

Но мы сталкиваемся с некоторыми проблемами конфигурации обоих из них одновременно.

Раньше у нас был этот файл конфигурации при использовании только AlterPhp:

#routes/easy_admin.yaml
easy_admin_bundle:
  resource: '@EasyAdminExtensionBundle/Controller/EasyAdminController.php'
  prefix: /admin
  type: annotation

И все было хорошо, когда мы использовали только этот комплект. Однако теперь мы хотим использовать этот пакет, а также тот, который был указан ранее, но также необходимо заменить контроллер easyadmin на контроллер из нового пакета.

Таким образом, оба расширения хотят делать одно и то же и оба расширяют BaseAdminController от EasyAdmin.

Как лучше использовать оба варианта в одном проекте?

Я нашел решение, создав собственный контроллер, расширяющий AdminController от Wandi, и скопировав методы из AdminController из Alterphp внутрь настраиваемого контроллера. Тем не менее, это кажется странным решением этой проблемы.


person Dylan Kas    schedule 04.03.2020    source источник


Ответы (1)


Я решил связаться с AlterPHP и Wandi на github и отправить запрос на включение их расширений, чтобы использовать типаж в их контроллере, чтобы упростить использование нескольких расширений.

И оба они ответили мне:

Ванди просмотрел мой PR и объединил его с основным. Теперь он доступен в выпуске 2.0.2.

AlterPHP просмотрел мой PR и объединил его с мастером. Теперь он доступен в выпуске 3.0.1.

Таким образом, с этими изменениями стало намного проще использовать оба расширения (и аналогичные EasyAdminExtension), используя эти новые черты:

use Wandi\EasyAdminPlusBundle\Controller\AdminController as WandiController;
use EasyCorp\Bundle\EasyAdminBundle\Controller\EasyAdminController;
use Wandi\EasyAdminPlusBundle\Controller\AdminControllerTrait as WandiTrait;
use AlterPHP\EasyAdminExtensionBundle\Controller\AdminExtensionControllerTrait as AlterPHPTrait;

class CustomAdminController extends EasyAdminController
{
    use AlterPHPTrait, WandiTrait;

    //You may have to solve conflict between those traits

}

У вас может быть несколько проблем, таких как службы, неизвестные контроллеру, или методы, определенные несколько раз.

Мне просто пришлось переопределить getSubscribedServices в моем контроллере, чтобы добавить те, которые используются AlterPHP и Wandi, а также разрешить конфликт с методом isActionAllowed, определенным в обоих трейтах.

use AlterPHP\EasyAdminExtensionBundle\Security\AdminAuthorizationChecker;
use EasyCorp\Bundle\EasyAdminBundle\Controller\EasyAdminController;
use Wandi\EasyAdminPlusBundle\Controller\AdminControllerTrait as WandiTrait;
use AlterPHP\EasyAdminExtensionBundle\Controller\AdminExtensionControllerTrait as AlterPHPTrait;
use Wandi\EasyAdminPlusBundle\Exporter\Configuration\NormalizerConfigPass;
use Wandi\EasyAdminPlusBundle\Exporter\Configuration\PropertyConfigPass;
use Wandi\EasyAdminPlusBundle\Exporter\Configuration\TemplateConfigPass;

class CustomAdminController extends EasyAdminController
{
    use AlterPHPTrait,WandiTrait { AlterPHPTrait::isActionAllowed insteadof WandiTrait; }

    //It is important to set the subscribed services from the trait because they cannot use them otherwise.
    public static function getSubscribedServices(): array
    {
        return \array_merge(parent::getSubscribedServices(), [
            AdminAuthorizationChecker::class, //This one is for AlterPHP and those below for Wandi
            'wandi.easy_admin_plus.exporter.configuration.normalizer_config_pass' => NormalizerConfigPass::class,
            'wandi.easy_admin_plus.exporter.configuration.property_config_pass' => PropertyConfigPass::class,
            'wandi.easy_admin_plus.exporter.configuration.template_config_pass' => TemplateConfigPass::class,
        ]);
    }


}

Мне пришлось изменить файл services.yaml, чтобы иметь возможность переопределить getSubscribedServices для Wandi.

#services.yaml
services:
  #...
  Wandi\EasyAdminPlusBundle\Exporter\Configuration\NormalizerConfigPass: '@wandi.easy_admin_plus.exporter.configuration.normalizer_config_pass'
  Wandi\EasyAdminPlusBundle\Exporter\Configuration\PropertyConfigPass: '@wandi.easy_admin_plus.exporter.configuration.property_config_pass'
  Wandi\EasyAdminPlusBundle\Exporter\Configuration\TemplateConfigPass: '@wandi.easy_admin_plus.exporter.configuration.template_config_pass'
person Dylan Kas    schedule 09.03.2020