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