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