首页 > 解决方案 > 通过 EasyAdminBundle(Wandi、AlterPHP...)使用多个扩展(包装器)

问题描述

我想使用AlterPHP 扩展以及带有EasyAdminBundle 的 Wandi 扩展。

但是我们同时面临一些问题配置。

我们曾经在仅使用 AlterPhp 时拥有此配置文件:

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

当我们只使用这个捆绑包时很好。但是,现在我们想使用这个包以及之前引用的那个,但它还需要用新包中的那个替换easyadmin控制器。

因此,两个扩展都想做同样的事情,并且都从EasyAdmin扩展BaseAdminController

在同一个项目中使用两者的最佳方法是什么?

我找到了一个解决方案,方法是制作一个从 Wandi 扩展 AdminController 的自定义控制器,并从自定义控制器中的Alterphp复制 AdminController 的方法。但是,对于这个问题,这似乎是一个奇怪的解决方案。

标签: phpsymfonyeasyadmin

解决方案


我决定在 github 上联系AlterPHPWandi ,并在他们的扩展上发送一个拉取请求,以在他们的控制器中使用 trait,以便更容易使用多个扩展。

所以他们俩都回答我:

Wandi审查了我的 PR 并将其合并到 master。它现在在2.0.2 版本中可用。

AlterPHP审查了我的 PR 并将其合并到 master。它现在在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才能为Wandi重新定义getSubscribedServices

#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'

推荐阅读