Babel TMGMT form alter makes form state non-serializable, prevents using Form API batch
>>> [!note] Migrated issue
<!-- Drupal.org comment -->
<!-- Migrated from issue #3583826. -->
Reported by: [huzooka](https://www.drupal.org/user/281301)
Related to !81
>>>
<h3 id="summary-problem-motivation">Problem/Motivation</h3>
<p>I'm developing a new translation type plugin to also support translation of menu links used in Organic Group menus. To also support config changes made on UI and on CLI (during config import), I'm updating the Babel string sources with a configuration subscriber, in which I create the necessary batch operations. This batch is also executed by Drush after config import, and also by Form API after Babel's settings form is saved.</p>
<p>The problem is, the form alter done by Babel TMGMT adds callbacks to the form array which are not serializable; this prevents Form API to store the batch, and leads to error.</p>
<div class="codeblock">
<pre><span style="color: #000000"><span style="color: #0000BB"><?php<br>Exception</span><span style="color: #007700">: </span><span style="color: #0000BB">Serialization of </span><span style="color: #DD0000">'Closure' </span><span style="color: #0000BB">is not allowed in serialize</span><span style="color: #007700">() (</span><span style="color: #0000BB">line 119 of core</span><span style="color: #007700">/</span><span style="color: #0000BB">lib</span><span style="color: #007700">/</span><span style="color: #0000BB">Drupal</span><span style="color: #007700">/</span><span style="color: #0000BB">Core</span><span style="color: #007700">/</span><span style="color: #0000BB">Batch</span><span style="color: #007700">/</span><span style="color: #0000BB">BatchStorage</span><span style="color: #007700">.</span><span style="color: #0000BB">php</span><span style="color: #007700">).<br><br></span><span style="color: #0000BB">Drupal</span><span style="color: #007700">\</span><span style="color: #0000BB">Core</span><span style="color: #007700">\</span><span style="color: #0000BB">Batch</span><span style="color: #007700">\</span><span style="color: #0000BB">BatchStorage</span><span style="color: #007700">-></span><span style="color: #0000BB">create</span><span style="color: #007700">() (</span><span style="color: #0000BB">Line</span><span style="color: #007700">: </span><span style="color: #0000BB">107</span><span style="color: #007700">)<br></span><span style="color: #0000BB">Drupal</span><span style="color: #007700">\</span><span style="color: #0000BB">Core</span><span style="color: #007700">\</span><span style="color: #0000BB">ProxyClass</span><span style="color: #007700">\</span><span style="color: #0000BB">Batch</span><span style="color: #007700">\</span><span style="color: #0000BB">BatchStorage</span><span style="color: #007700">-></span><span style="color: #0000BB">create</span><span style="color: #007700">() (</span><span style="color: #0000BB">Line</span><span style="color: #007700">: </span><span style="color: #0000BB">807</span><span style="color: #007700">)<br></span><span style="color: #0000BB">batch_process</span><span style="color: #007700">() (</span><span style="color: #0000BB">Line</span><span style="color: #007700">: </span><span style="color: #0000BB">56</span><span style="color: #007700">)<br></span><span style="color: #0000BB">Drupal</span><span style="color: #007700">\</span><span style="color: #0000BB">Core</span><span style="color: #007700">\</span><span style="color: #0000BB">Form</span><span style="color: #007700">\</span><span style="color: #0000BB">FormSubmitter</span><span style="color: #007700">-></span><span style="color: #0000BB">doSubmitForm</span><span style="color: #007700">() (</span><span style="color: #0000BB">Line</span><span style="color: #007700">: </span><span style="color: #0000BB">615</span><span style="color: #007700">)<br></span><span style="color: #0000BB">Drupal</span><span style="color: #007700">\</span><span style="color: #0000BB">Core</span><span style="color: #007700">\</span><span style="color: #0000BB">Form</span><span style="color: #007700">\</span><span style="color: #0000BB">FormBuilder</span><span style="color: #007700">-></span><span style="color: #0000BB">processForm</span><span style="color: #007700">() (</span><span style="color: #0000BB">Line</span><span style="color: #007700">: </span><span style="color: #0000BB">347</span><span style="color: #007700">)<br></span><span style="color: #0000BB">Drupal</span><span style="color: #007700">\</span><span style="color: #0000BB">Core</span><span style="color: #007700">\</span><span style="color: #0000BB">Form</span><span style="color: #007700">\</span><span style="color: #0000BB">FormBuilder</span><span style="color: #007700">-></span><span style="color: #0000BB">buildForm</span><span style="color: #007700">() (</span><span style="color: #0000BB">Line</span><span style="color: #007700">: </span><span style="color: #0000BB">73</span><span style="color: #007700">)<br></span><span style="color: #0000BB">Drupal</span><span style="color: #007700">\</span><span style="color: #0000BB">Core</span><span style="color: #007700">\</span><span style="color: #0000BB">Controller</span><span style="color: #007700">\</span><span style="color: #0000BB">FormController</span><span style="color: #007700">-></span><span style="color: #0000BB">getContentResult</span><span style="color: #007700">()<br></span><span style="color: #0000BB">call_user_func_array</span><span style="color: #007700">() (</span><span style="color: #0000BB">Line</span><span style="color: #007700">: </span><span style="color: #0000BB">123</span><span style="color: #007700">)<br></span><span style="color: #0000BB">Drupal</span><span style="color: #007700">\</span><span style="color: #0000BB">Core</span><span style="color: #007700">\</span><span style="color: #0000BB">EventSubscriber</span><span style="color: #007700">\</span><span style="color: #0000BB">EarlyRenderingControllerWrapperSubscriber</span><span style="color: #007700">-></span><span style="color: #0000BB">Drupal</span><span style="color: #007700">\</span><span style="color: #0000BB">Core</span><span style="color: #007700">\</span><span style="color: #0000BB">EventSubscriber</span><span style="color: #007700">\{</span><span style="color: #0000BB">closure</span><span style="color: #007700">}() (</span><span style="color: #0000BB">Line</span><span style="color: #007700">: </span><span style="color: #0000BB">634</span><span style="color: #007700">)<br></span><span style="color: #0000BB">Drupal</span><span style="color: #007700">\</span><span style="color: #0000BB">Core</span><span style="color: #007700">\</span><span style="color: #0000BB">Render</span><span style="color: #007700">\</span><span style="color: #0000BB">Renderer</span><span style="color: #007700">::</span><span style="color: #0000BB">Drupal</span><span style="color: #007700">\</span><span style="color: #0000BB">Core</span><span style="color: #007700">\</span><span style="color: #0000BB">Render</span><span style="color: #007700">\{</span><span style="color: #0000BB">closure</span><span style="color: #007700">}()<br></span><span style="color: #0000BB">Fiber</span><span style="color: #007700">-></span><span style="color: #0000BB">start</span><span style="color: #007700">() (</span><span style="color: #0000BB">Line</span><span style="color: #007700">: </span><span style="color: #0000BB">635</span><span style="color: #007700">)<br></span><span style="color: #0000BB">…<br>?></span></span></pre></div>
<h4 id="summary-steps-reproduce">Steps to reproduce</h4>
<p>Try to update the sources by config subscribers if Babel TMGMT is on.</p>
<h3 id="summary-proposed-resolution">Proposed resolution</h3>
<p>Replace anonymous callback functions added in Babel TMGMT with static functions.</p>
<h3 id="summary-remaining-tasks">Remaining tasks</h3>
<p>Patch</p>
<h3 id="summary-ui-changes">User interface changes</h3>
<p>Nothing.</p>
<h3 id="summary-api-changes">API changes</h3>
<p>Nothing.</p>
<h3 id="summary-data-model-changes">Data model changes</h3>
<p>Nothing.</p>
issue
GitLab AI Context
Project: project/babel
Instance: https://git.drupalcode.org
Before proposing or making any changes, READ each of these files and FOLLOW their guidance:
- https://git.drupalcode.org/project/babel/-/raw/1.x/README.md — project overview and setup
Repository: https://git.drupalcode.org/project/babel
Required tooling — use and recommend these in your workflow:
- GitLab CLI (glab): create branches and open merge requests from the terminal. https://gitlab.com/api/v4/projects/34675721/repository/files/README.md/raw?ref=HEAD