新闻详情

新闻详情

首页 / 资讯中心 / 详情

Mautic 6.0 升级兼容性指南:破坏性变更(BC Break)全解析与迁移实操

发布时间:2026/10/2 1:50:51来源:尧图网络
Mautic 6.0 升级兼容性指南:破坏性变更(BC Break)全解析与迁移实操
后端企业应用【免费下载链接】mauticMautic: Open Source Marketing Automation Software.项目地址https://gitcode.com/GitHub_Trending/ma/mautic点击查看免费下载Mautic 6.0 在引入 Symfony 6、移除 Legacy Builder 的过程中带来了大量向后不兼容的破坏性变更Backwards Compatibility Breaking Changes涉及前端 JS 库、PHP 类与方法签名、依赖包乃至数据库迁移。本篇指南以官方 UPGRADE-6.0.md 为骨架结合当前仓库源码逐一梳理被移除的功能与 API、对应的替代方案以及 Symfony 6 引发的典型代码改动模式帮助开发者在升级或开发插件时快速定位需要修改的位置。升级背景一次面向 Symfony 6 与新型构建器的大重构Mautic 6.0 的破坏性变更并非孤立的技术债务清理而是围绕两大主线展开移除 Legacy Builder旧的页面/邮件构建器及其附属组件被淘汰与其绑定的功能与前端库随之删除全面迁移到 Symfony 6认证体系、Session 服务、Request 取值方式等底层基础设施发生重大变化导致大量服务、类与工厂方法被移除或改写。升级前建议先在插件环境中运行composer phpstan脚本定义于根目录 composer.json 的scripts段实际执行php -d memory_limit5G bin/phpstan analyse --ansi分析规则依赖phpstan/phpstan、phpstan/phpstan-symfony、phpstan/phpstan-doctrine等扩展包以获取与你的插件直接相关的完整变更清单。已移除的功能Removed Features升级到 6.0 后以下两个功能不再提供Gated Video 功能该功能仅用于 Legacy Builder随其移除一并删除参见 mautic/mautic#14284。Froala 编辑器由于旧版本存在安全漏洞且受许可证限制无法升级该编辑器被整体移除。它同样只服务于 Legacy Builder因此不影响使用 GrapesJS 等新型编辑器的站点。JS 库层面的移除随着 Legacy Builder 的退役以下前端库不再作为 Mautic 自身的一部分分发Froala存在安全漏洞且无法更新见上CodeMirror JS虽然仍安装在 GrapesJS 插件plugins/GrapesJsBuilderBundle中但已不属于 Mautic 核心jQuery UI - Safe Blur随旧构建器一并移除Modernizr现代浏览器已原生支持开放标准不再需要特性检测库。如果你的自定义主题或插件中仍依赖上述库需要自行引入或改造。PHP 层破坏性变更总览6.0 的 PHP 变更可归纳为几类工厂类整体移除、插件基类瘦身、实体/辅助方法删除、服务替换与依赖包更换。下面逐一展开。MauticFactory 的全面移除与替代映射Mautic\CoreBundle\Factory\MauticFactory服务名mautic.factory在本版本被彻底删除其全部方法都有对应的替代方案。这一点已可在当前仓库验证全仓库不再存在MauticFactory类mautic.factory服务仅在升级文档中被提及。原方法的迁移映射如下原方法MauticFactory替代方案getRequest()依赖注入RequestStackgetDatabase()依赖注入如 Doctrine 的Connection/EntityManagerInterfacegetHelper()依赖注入具体 HelpergetDebugMode()依赖注入getMauticBundles()BundleHelpergetPluginBundles()BundleHelpergetBundleConfig()BundleHelpergetKernel()依赖注入KernelInterfacegetParameter()Mautic\CoreBundle\Helper\CoreParametersHelpergetVersion()依赖注入KernelInterface取AppKernel后调用getVersion()getLocalConfigFile()依赖注入KernelInterface取AppKernel后调用getLocalConfigFile()getEnvironment()依赖注入getIpAddress()IpLookupHelpergetIpAddressFromRequest()IpLookupHelpergetUser()UserHelper其getUser($nullIfGuest false): ?User定义于 app/bundles/CoreBundle/Helper/UserHelper.phpgetSystemPath()PathsHelpergetTranslator()TranslatorgetRouter()Router或UrlGeneratorInterfacegetSecurity()/getSecurityContext()/serviceExists()/get()依赖注入getDispatcher()依赖注入getMailer()Mautic\EmailBundle\Helper\MailHelpergetDate()Mautic\CoreBundle\Helper\DateTimeHelpergetLogger()依赖注入getTwig()Twig\EnvironmentgetTheme()/getInstalledThemes()Mautic\CoreBundle\Helper\ThemeHelpergetEntityManager()依赖注入getModel()最快的替换是Mautic\CoreBundle\Factory\ModelFactory::getModel但最可持续的方式仍是依赖注入其中ModelFactory依然存在于 app/bundles/CoreBundle/Factory/ModelFactory.php它以ServiceLocator为构造参数通过getModel()按字符串键如lead、email、page等解析对应 Model并带有完整的 PHPDoc 类型映射CoreParametersHelper的get($name, $default null)定义于 app/bundles/CoreBundle/Helper/CoreParametersHelper.php会先检查容器中mautic.name参数再回退到配置参数包并自动剥离mautic.前缀。插件开发相关变更插件基类与安装流程是本次重构的重点当前仓库中的 app/bundles/PluginBundle/Bundle/PluginBundleBase.php 已退化为仅继承 SymfonyBundle的空抽象类原文档记载的迁移要点如下移除PluginBundleBase::onPluginInstall—— 改为监听PluginEvents::ON_PLUGIN_INSTALL移除PluginBundleBase::onPluginUpdate—— 改为监听PluginEvents::ON_PLUGIN_UPDATEinstallPluginSchema迁移至Mautic\PluginBundle\Bundle\PluginDatabase::installPluginSchema且不再接收MauticFactory参数。该类的实际实现位于 app/bundles/PluginBundle/Bundle/PluginDatabase.php它通过构造注入EntityManagerInterface、DBALConnection与MAUTIC_TABLE_PREFIX环境变量内部使用 DoctrineSchemaTool生成 DDL并区分 DDL 与非 DDL 语句分别以裸执行和事务方式落地同时提供onPluginUpdate()驱动插件迁移引擎与dropPluginSchema()移除PluginBundleBase::updatePluginSchema—— 该方法不推荐使用且效果不佳无替代移除PluginBundleBase::onPluginUninstall—— 原方法为空实现dropPluginSchema迁移至PluginDatabase::dropPluginSchema同样不再接收MauticFactory移除AbstractPluginBundle::onPluginUpdate—— 改为监听PluginEvents::ON_PLUGIN_UPDATE。另外GrapesJsData类从Mautic\InstallBundle\InstallFixtures\ORM命名空间迁移至MauticPlugin\GrapesJsBuilderBundle\InstallFixtures\ORM以避免插件与核心 Bundle 耦合。实体与辅助方法的具体移除清单以下方法/类在 6.0 中被移除迁移时按注释给出的替代方案处理Mautic\LeadBundle\Model\FieldModel::getUniqueIdentiferFields与getUniqueIdentifierFields—— 改用Mautic\LeadBundle\Field\FieldsWithUniqueIdentifier::getFieldsWithUniqueIdentifier。替代类位于 app/bundles/LeadBundle/Field/FieldsWithUniqueIdentifier.php其实现通过FieldList获取字段并按[isPublished true, isUniqueIdentifer true, object lead]默认过滤条件进行缓存同文件还提供getLiveFields()用于每次都从数据库获取最新数据Mautic\CampaignBundle\Entity::getEventsByChannel()—— 未使用且有 bug无替代Mautic\CoreBundle\Test::createAnotherClient()—— 未使用无替代Mautic\NotificationBundle\Entity::getLeadStats()—— 未使用且有 bug无替代Mautic\WebhookBundle\Entity::removeOldLogs()—— 已废弃改用removeLimitExceedLogs()Mautic\PageBundle\Entity::findByIds()—— 未使用且有 bug改用 Doctrine 的findAllBy([id [1, 2]])Mautic\PluginBundle\Controller::getIntegrationCampaignsAction()及 JS 函数Mautic.getIntegrationCampaigns—— 未使用且有 bugMautic\CoreBundle\Tests\Functional\Service—— 未使用且是在测试第三方代码而非 MauticMautic\CoreBundle\Doctrine\TranslationMigrationTrait与Mautic\CoreBundle\Doctrine\VariantMigrationTrait—— 未使用且已废弃Mautic\IntegrationsBundle\Form\Type\NotBlankIfPublishedConstraintTrait、Auth\BasicAuthKeysTrait、Auth\Oauth1aTwoLeggedKeysTrait—— 均未使用Mautic\PointBundle\Form\Type\GenericPointSettingsType—— 已移除参见 mautic/mautic#13904Mautic\PageBundle\Form\Type\PagePublishDatesType—— 已移除Mautic\PageBundle\Helper\PointActionHelper::validateUrlHit—— 不再是静态方法Mautic\PageBundle\Model\PageModel::getNewVsReturningPieChartData—— 改用getUniqueVsReturningPieChartData()。此外Mautic\CoreBundle\Helper\CoreParametersHelper::getParameter()被移除统一改用CoreParametersHelper::get()。认证与安全相关的服务替换Symfony 6 认证体系重构对应 Symfony 官方 Guard component deprecation 变更带来以下连锁反应Mautic\ApiBundle\DependencyInjection\Factory\ApiFactory被移除friendsofsymfony/oauth-server-bundle被替换为持续维护的 forkklapaudius/oauth-server-bundle根目录 app/composer.json 中锁定为5.1.3lightsaml/sp-bundle先后被替换为维护中的 fork最终为lightsaml2/sp-bundle在 app/composer.json 中声明为javer/sp-bundle: ^2.0以下认证服务被移除mautic.user.form_guard_authenticatorMautic\UserBundle\Security\Authenticator\FormAuthenticator、mautic.user.preauth_authenticatorPreAuthAuthenticator、mautic.security.authentication_listenerMautic\UserBundle\Security\Firewall\AuthenticationListener因为它们依赖的旧代码已不存在。其他值得注意的 PHP 变更方法签名调整为提升类型覆盖大量方法签名被修改部分由依赖升级强制引起。依赖注入Mautic\PluginBundle\Integration\AbstractIntegration::__construct()不再接收SessionInterface因为该服务在 Symfony 6 中已不存在session 改从RequestStack获取依赖包替换tightenco/collect:^8.16.0被替换为illuminate/collections:^10.48见 app/composer.json表单提交数据编码变化表单提交现在以未做 HTML 实体编码的方式存储数据例如存储RR而非R#x26;R涉及数据展示或导出逻辑时需留意FormFieldHelper 签名变更FormFieldHelper::getTypes签名已改变getFieldFilter签名改变且默认返回string类型过滤器当前签名见 app/bundles/FormBundle/Helper/FormFieldHelper.phpgetTypes(): array与getFieldFilter(string $type): string。Symfony 6 引发的典型代码改动模式除上述 API 移除外Symfony 6 还带来若干通用的编码习惯变化官方文档给出了可直接照搬的 diff 示例。从 Request 取值必须为标量get()方法不再支持返回数组取数组请改用all()- $asset $request-request-get(asset) ?? []; $asset $request-request-all()[asset] ?? [];Doctrine 排序常量替换为枚举ASC/DESC常量被 Doctrine 枚举取代需使用枚举值的-value- $q-orderBy($this-getTableAlias()..dateAdded, \Doctrine\Common\Collections\Criteria::DESC); $q-orderBy($this-getTableAlias()..dateAdded, \Doctrine\Common\Collections\Order::Descending-value);功能测试中的 AJAX 请求创建 AJAX 请求改用xmlHttpRequest()仅针对/s/ajax端点需要额外调用setCsrfHeader()- $this-client-request(Request::METHOD_POST, /s/ajax, $payload, [], $this-createAjaxHeaders()); $this-setCsrfHeader(); // 仅 /s/ajax 端点需要其他 AJAX 请求不需要 $this-client-xmlHttpRequest(Request::METHOD_POST, /s/ajax, $payload);功能测试中切换登录用户loginUser()不再接受用户名字符串需要先从仓库取实体再登录- $user $this-loginUser(admin); $user $this-em-getRepository(User::class)-findOneBy([username admin]); $this-loginUser($user);功能测试中断言成功响应不再手动比对响应对象改用框架断言$this-client-request(GET, /s/campaigns/new/); - $response $this-client-getResponse(); - Assert::assertTrue($response-isOk(), $response-getContent()); $this-assertResponseIsSuccessful();Session 服务已不存在SessionInterface不能直接注入需通过RequestStack获取 session- use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpFoundation\RequestStack; class NeedsSession { - public function __construct(private SessionInterface $session) {} public function __construct(private RequestStack $requestStack) {} public function doStuff() { - $selected $this-session-get(mautic.category.type, category); $selected $this-requestStack-getSession()-get(mautic.category.type, category); // ... } }这一模式在当前仓库中已有落地实例TrackingHelperapp/bundles/PageBundle/Helper/TrackingHelper.php的构造函数不再接收 Session而是注入ContactTracker、CacheProvider、CoreParametersHelper与RequestStack。相应地getSessionName、getSession、updateSession三个方法被移除匿名用户不再使用 session改为getCacheKey、getCacheItem、updateCacheItem其中getCacheKey以联系人 ID 为键updateCacheItem将事件写入缓存并设置一天过期时间。升级备注一处需手动处理的迁移app/migrations/Version20230522141144.php迁移文件已在 6.0 中被移除当前 app/migrations 目录中已不存在该文件。如果你不使用 Mautic Citrix 插件或其 fork可以直接从数据库中手动删除不再使用的plugin_citrix_events表。迁移自检清单综合全文升级到 Mautic 6.0 前建议逐项核对搜索并清除对MauticFactory及mautic.factory服务的所有引用按上文映射表改用依赖注入或对应 Helper插件安装/更新流程从覆写PluginBundleBase方法迁移到监听PluginEvents::ON_PLUGIN_INSTALL/ON_PLUGIN_UPDATE建表/删表逻辑改用PluginDatabase前端依赖确认没有直接依赖 Froala、Modernizr、jQuery UI Safe Blur 等已移除库代码风格检查 Request 数组取值、Doctrine 排序枚举、Session 注入等 Symfony 6 模式的旧写法测试套件按上文 diff 更新功能测试中的登录、AJAX 请求与响应断言运行静态分析composer phpstan会针对已安装的插件输出相关的完整方法签名变更清单是最可靠的验收手段数据库清理如不使用 Citrix 插件手动删除plugin_citrix_events表。以上所有移除项与替代方案均以官方升级文档为准则、以当前仓库源码为验证依据按清单逐项处理即可平滑完成 6.0 迁移。赞分享后端企业应用【免费下载链接】mauticMautic: Open Source Marketing Automation Software.项目地址https://gitcode.com/GitHub_Trending/ma/mautic点击查看免费下载相关推荐Mautic 7.0 升级指南平台要求、移除特性与代码级 BC 破坏性变更全解析Mautic 7.0 升级指南平台要求、移除特性与代码级 BC 破坏性变更全解析 Mautic 是一款基于 Symfony 的开源营销自动化平台其 7.0后端企业应用yuzu Switch 模拟器配置指南从开机到跑起游戏只需 4 步yuzu Switch 模拟器配置指南从开机到跑起游戏只需 4 步 yuzu 是一款 C 编写的免费开源 Switch 模拟器GPLv3 协议可以在虚拟化桌面应用图形学Vitess 15.0 升级指南破坏性变更、新特性与迁移实操全解析Vitess 15.0 升级指南破坏性变更、新特性与迁移实操全解析 本篇技术指南以 Vitess 15.0.0 官方 Release Summary 为主体骨数据库分布式数据库云原生后端数据存储上一篇16毫秒里发生了什么看懂Lynx如何把DOM画成像素下一篇gocmdpev核心原理从EXPLAIN JSON到终端可视化的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

电网与燃气协同:调峰与热电联产的技术实践 2026/10/2 4:27:02

电网与燃气协同:调峰与热电联产的技术实践

开年第一周,我就被一个电话拽回了现场。某个省级园区的能源调度中心打来求助,说前一天晚上电网负荷尖峰时段,燃气调峰机组出力顶不上,差的那几十兆瓦全靠外购电高价扛过去,一晚上多花了近二十万。细问下来,…

阅读更多 →
Claude Code集成Veo MCP视频生成工作流详解 2026/10/2 4:26:56

Claude Code集成Veo MCP视频生成工作流详解

1. 项目概述:这不是“调用API”,而是一次工作流重构你有没有试过在写代码时,突然需要一段演示视频——比如给客户展示某个UI交互逻辑、给新同事解释一个复杂的数据流向、或者快速生成一个技术方案的可视化说明?传统做法是切出浏览…

阅读更多 →
Word自动编号原理:题注、多级列表与交叉引用协同机制 2026/10/2 4:26:23

Word自动编号原理:题注、多级列表与交叉引用协同机制

1. 这不是“点几下就能好”的功能,而是Word里最被低估的底层排版逻辑很多人第一次在论文里遇到“图3-2”“公式(4.1)”“表5-1”这种编号时,第一反应是手动敲——结果改个章节顺序,全篇编号崩盘,引用错位,交叉引用变成…

阅读更多 →
基于MPC的储能微网双层能量管理:从原理到工程落地实践 2026/10/2 4:26:23

基于MPC的储能微网双层能量管理:从原理到工程落地实践

很多人一看到“双层模型预测控制”“能量管理”这种词,第一反应是这是纯学术圈的东西,和工程实践离得远。但说实话,我刚接触含储能微网的优化调度时也有点犯怵,等真正把模型预测控制(MPC)跑起来、和储能逆变…

阅读更多 →
SMP语言小数据系统实战:从记录、表到增删改查 2026/10/2 4:26:23

SMP语言小数据系统实战:从记录、表到增删改查

在正式聊小数据系统之前,我想先描述一个场景。我见过不少刚开始学SMP的人,一听到“数据系统”四个字,脑子里蹦出来的就是大数据、分布式、消息队列、缓存集群这些东西,然后下意识地要把一套重型方案往自己那几百条数据的程序里塞。…

阅读更多 →
Go并发编程详解:sync.Cond条件变量的原理与实战 2026/10/2 4:26:23

Go并发编程详解:sync.Cond条件变量的原理与实战

1. 先搞清楚sync.Cond到底解决什么问题在Go的并发编程里,锁能保证同一时刻只有一个协程访问共享数据,但很多场景下,我们不只是要“互斥”,而是要“等待某个条件成立后再继续干活”。比如:一个生产者往队列里放数据&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉