提问者:小点点

使用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中的方法。然而,对于这个问题,这似乎是一个奇怪的解决方案。


共1个答案

匿名用户

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

于是他们两个都对我说:

Wandi检查了我的PR并将其合并到master。它现在在2.0版中可用。2.

AlterPHP审查了我的PR并将其合并到master。它现在在3.0版中提供。1.

因此,通过这些更改,使用这些新特性可以更容易地使用两个扩展(和类似的EasyAdminExent):

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

}

您可能有多个问题,例如控制器不知道的服务或多次定义的方法。

我只需要在我的控制器中重新定义getSubscribeServices,以添加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重新定义getSubcribedServices。

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