在 EasyAdminBundle(Wandi、AlterPHP...)中使用多个扩展(包装器)

Using multiple extensions (wrappers) with EasyAdminBundle (Wandi, AlterPHP...)

我想将 AlterPHP extension as well as the Wandi extension 与 EasyAdminBundle 一起使用。

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

我们过去只使用 AlterPhp 时就有这个配置文件:

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

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

所以两个扩展都想做同样的事情,并且都从 EasyAdmin.

扩展了 BaseAdminController

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

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

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

所以他们都回复了我:

万迪reviewed my PR and merged it to master. It is now available in release 2.0.2.

AlterPHP reviewed my PR and merged it to master. It is now available in release 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 38=].

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