I've added custom fields to maniphest and they work fine, but when I try to add them to Projects, any item that uses storage enters an infinite loop when you try to save it.
Reproduce steps:
Place this file in src/extensions, and try to edit a project.
(As a note, I have no idea if setting the proxy in the constructor is the right way, but it seemed to work for maniphest task custom fields)
Results in the error:
>>> UNRECOVERABLE FATAL ERROR <<< Maximum function nesting level of '100' reached, aborting! /opt/code/phabricator/src/infrastructure/customfield/standard/PhabricatorStandardCustomField.php:62 ┻━┻ ︵ ¯\_(ツ)_/¯ ︵ ┻━┻
More details
Xdebug shows that we are bouncing between PhabricatorCustomField->newStorageObject() and PhabricatorStandardCustomField->newStorageObject()
... [3] file:///opt/code/phabricator/src/infrastructure/customfield/standard/PhabricatorStandardCustomField.php.PhabricatorStandardCustomField->newStorageObject:233 [4] file:///opt/code/phabricator/src/infrastructure/customfield/field/PhabricatorCustomField.php.PhabricatorCustomField->newStorageObject:526 [5] file:///opt/code/phabricator/src/infrastructure/customfield/standard/PhabricatorStandardCustomField.php.PhabricatorStandardCustomField->newStorageObject:233 [6] file:///opt/code/phabricator/src/infrastructure/customfield/field/PhabricatorCustomField.php.PhabricatorCustomField->newStorageObject:526 [7] file:///opt/code/phabricator/src/infrastructure/customfield/standard/PhabricatorStandardCustomField.php.PhabricatorStandardCustomField->newStorageObject:233 ...
Solution
The solution I found was making PhabricatorProjectCustomField add some missing methods that were implemented in ManiphestCustomField:
public function newStorageObject() { return new PhabricatorProjectCustomFieldStorage(); } protected function newStringIndexStorage() { return new PhabricatorProjectCustomFieldStringIndex(); } protected function newNumericIndexStorage() { return new PhabricatorProjectCustomFieldNumericIndex(); }
Diff incoming.