php - 通过 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 的方法。但是,对于这个问题,这似乎是一个奇怪的解决方案。
解决方案
我决定在 github 上联系AlterPHP和Wandi ,并在他们的扩展上发送一个拉取请求,以在他们的控制器中使用 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'
推荐阅读
- java - Java 套接字聊天服务器有消息问题
- csv - 在csv文件问题的每一列中添加双引号的脚本
- node.js - Nodejs/Express/Typescript 需要 module.exports
- oracle - 我在我的 SQL Developer 中测试了一个关于“按顺序排列的子查询”的案例
- reactjs - 同一组件上的链接不刷新页面
- graph - 图时间和空间复杂度表示
- android - 从图库中选择视频文件会在 android 中创建一个空白屏幕
- javascript - 数组填充的奇怪行为?
- swift - 更改 SFSafariViewController 的条形颜色
- flutter - 运行 Gradle 任务 'assembleDebug'... [致命错误] aapt2-3.5.0-5435860.pom:2:1:prolog 中不允许内容